构造函数

访问控制符只作用于类,而非作用于对象,因此,同一个类的不同对象,可以互相访问非公有部分。

构造函数

  --缺省构造函数

    即无参构造函数,但并非真正没有任何参数,为有参构造函数的每个参数提供缺省值,同样是无参构造函数的效果;

    编译器会给没有定义构造函数的类,提供缺省的构造函数。只要类中已定义了构造函数,编译器都不再提供缺省构造函数;

    对基本类型的成员变量,不做初始化;

    对类类型的成员变量和基类子对象,调用相应类型的缺省构造函数初始化;

    有时需自己定义缺省构造函数,即使它什么也不做,尤其是在使用数组或容器时(定义类数组时,必须调用无参构造函数);

    有时需为一个类提供缺省构造函数,仅仅因为它可能作为另一个类的子对象而被缺省构造;

    若子对象不宜缺省构造,则需要为父对象提供缺省构造函数,并在其中显示的以非缺省方式构造该子对象

//父提供子对象的非缺省构造函数类型

class c
{public :
    c(int data)
    {
        m_data = data;
    }
private :
    int m_data;
};
class d
{
public:
    D () :m_c(10){}
    c m_c;
};

  --类型转换构造函数

    在目标类型中,可以接受单个原类型对象实参的构造函数,支持从原类型到目标类型的隐形类型转换

class object
{
       object (const object & origal)
            {
                    
            } 
//object (基本类型 value)
       {
            成员变量 = value;
        } };

//拷贝构造函数

类名 (const 类名& other)
{
   成员变量 = other.变量;
}        

 

  --拷贝构造函数

    若定义了拷贝构造函数,编译器不再提供缺省构造函数,这时,所有与成员复制有关的操作,都必须在自定义拷贝构造函数中编写代码完成。

      在父类型中定义拷贝构造函数,若无显示定义子对象的拷贝构造函数,则调用子对象的缺省构造函数。想要调用子对象的拷贝构造函数,则需显示定义子对象拷贝构造函数。

    

class A 
{
public:
    A (){cout << "A 的缺省构造" << endl;}
    A(const A & other)
    {
        cout << "A 的拷贝构造" << endl;
    }
private :
    int m_a;

};
class B
{
 public:
    B (){cout << "B 的缺省构造" << endl;};
    B (const B & other)//并没有对子对象A进行拷贝,若让A调用非缺省构造,则需显示定义
    {
        cout << "B 的拷贝构造" << endl;
    }
  
    A a;
};

int main()
{
    B b1;//A 的缺省构造,B的缺省构造
    B b2 = b1;//A的缺省构造,B的拷贝构造;
    
    system("pause");
}
//构造函数

#include "stdafx.h"
#include<iostream>
using namespace std;
class Integer 
{
public :
    //缺省构造函数(无参构造函数)
    Integer ( ){
        m_data = 0;
    }
    Integer(int data = 0){ }//带缺省参数的构造函数,可用无参的形式调用
    //类型转换构造函数(单参构造函数)
    Integer ( int data )
    {
        m_data = data;
    }
    //缺省拷贝构造函数
    
    Integer (const Integer& that)
    {
        m_data = that.m_data;
    }
    void Set( int data )
    {
        m_data = data;
    }
    int get ( )
    {
        return m_data;
    }
private:
    int m_data;

};

int _tmain(int argc, _TCHAR* argv[])
{
    Integer s1;
    cout << s1.get() << endl;
    s1= 100;
    //等价于s1= Integer (100),将int 型转换为Integer 型
    cout << s1.get() << endl;
    Integer s2(s1);
    cout << s2.get() << endl;
    system("pause");
    
    return 0;
}

  

原文地址:https://www.cnblogs.com/day-up/p/5125575.html