构造函数
访问控制符只作用于类,而非作用于对象,因此,同一个类的不同对象,可以互相访问非公有部分。
构造函数
--缺省构造函数
即无参构造函数,但并非真正没有任何参数,为有参构造函数的每个参数提供缺省值,同样是无参构造函数的效果;
编译器会给没有定义构造函数的类,提供缺省的构造函数。只要类中已定义了构造函数,编译器都不再提供缺省构造函数;
对基本类型的成员变量,不做初始化;
对类类型的成员变量和基类子对象,调用相应类型的缺省构造函数初始化;
有时需自己定义缺省构造函数,即使它什么也不做,尤其是在使用数组或容器时(定义类数组时,必须调用无参构造函数);
有时需为一个类提供缺省构造函数,仅仅因为它可能作为另一个类的子对象而被缺省构造;
若子对象不宜缺省构造,则需要为父对象提供缺省构造函数,并在其中显示的以非缺省方式构造该子对象
//父提供子对象的非缺省构造函数类型
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; }