因为C++的三大特性之一是数据隐藏,成员变量都是私有的,所以类不能像结构那样直接初始化,而需要构造函数,将需要初始化的数据在对象中实现初始化。构造函数与其他函数不同,没有返回值,也不能被对象调用(只是用于对象的初始化)。实质是类的隐式初始化,在对象初始化的时候,自动被调用。
构造函数可以分为一般的构造函数(分有参和无参)和用于对象复制的复制构造函数(又称拷贝构造函数)。
使用new来创建对象的时候,对象实际上没有名称,得到一个指向对象地址的指针,可以通过该指针管理对象。
#include <iostream> using namespace std; class Test { public: Test() //无参构造函数,也叫默认构造函数,如果形参列表不为空且每个形参都有默认值,则也称为默认构造函数 { cout<<"struct1 of Test!"<<endl; } Test(const Test &another) //拷贝构造函数 { m_a=another.m_a; cout<<"struct2 of Test!"<<endl; } Test(int a) :m_a(a) //有参构造函数,非默认构造函数,如果参数列表中所有的形参都有默认值,则是默认构造函数 { m_a = a; cout<<"struct3 of Test!"<<endl; } void print() { cout << " m_a = " << m_a << endl; } private: int m_a; };
void main()
{
Test t1(10); //括号法 //c++编译器自动调用这个类的有参构造函数
t1.print();
Test t2 = 20; //等号法 //c++编译器自动调用这个类的有参构造函数
t2.print();
Test t3=Test(30); //手工法 //程序员手工的调用构造函数 进行对象初始化
t3.print();
}
当且仅当没有任何构造函数时,编译器才会提供默认构造函数,一旦用户定义了非默认构造函数而不提供默认的构造函数,试图使用默认构造形式初始化对象时,会导致错误(编译器不再提供默认构造函数)。
C++11中的列表初始化
C++11标准支持的列表初始化,需要提供与某个构造函数的参数列表匹配的内容,并将其括起来即可。
Test test = {"test construct", 0, 0.0}; //匹配Test::Test(const tring &str, int a, double b)
Test test = {"test const"}; //匹配Test::Test(const string &str, int a, double b)
Tets test = {}; //匹配Test::test()
const成员函数
类方法结尾加上const修饰符后成为const成员函数,在C++的规则中,当方法不修改调用对象时,最好将其声明为const型的。试图用一个const型的对象调用一个非const型的成员函数会被编译器报告错误,因为编译器不能保证该方法不会改变调用对象。
this指针