一般而言,所有的对象都需要一个确定的初始状态!
C++中的类可以定义与类名相同的特殊成员函数,这种类名相同的成员函数叫做构造函数,构造函数在定义时可以有参数,但是没有任何返回类型的声明(和返回void是两个概念)。
构造函数的调用:一般情况下C++编译器自动调用构造函数
#include <iostream> using namespace std; class Test { private: int i,j,k; public: Test(int v) { i = j = k = v; } void print() { printf("i = %d,j = %d,k = %d ",i,j,k); } }; int main() { Test t1(4);//自动调用构造函数 Test t2 = 5;//自动调用构造函数 Test t3 = Test(6);//主动调用构造函数 t1.print(); t2.print(); t3.print(); Test tA[3] = {Test(1),Test(2),Test(3)};//主动调用构造函数 for(int i=0;i<3;i++) { tA[i].print(); } return 0; }
两个特殊的构造函数:拷贝构造函数和默认构造函数
无参构造函数:当类中没有定义任何一个构造函数,C++编译器会为我们提供无参构造函数和拷贝构造函数。默认构造函数为空什么都不做
拷贝构造函数:当类中定义了任意的非拷贝构造函数是,C++编译器就不会提供无参构造函数了,会为我们提供拷贝构造函数。默认拷贝构造函数会对成员变量一 一复制。
#include <iostream> using namespace std; class Test { private: public: Test(const Test& v)//拷贝构造函数 { printf("Test(const Test& v) "); } Test()//默认构造函数 { printf("Test() "); } }; int main() { Test t1; Test t2 = t1; return 0; }
C++中提供了初始化列表对成员变量进行初始化
语法规则:
Constructot::Constructot():m1(v1),m2(v1,v2),m3(v3) { //some other assignment operation }
注意:1.成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关 2初始化列表先于构造函数的函数体执行
(初始化与赋值的不同:初始化是用已存在的对象或值对正在创建的对象进行初值设置,赋值是用已存在的对象或值对已经存在的对象进行值设置。)。
#include <iostream> using namespace std; class M { private: int mI; public: M(int i) { printf("M(int i),i = %d ",i); mI = i; } int getI() { return mI; } }; class Test { private: const int c; M m1; M m2; public: Test():c(1),m1(2),m2(3) { printf("Test() "); } void print() { printf("c = %d,m1.mI = %d,m2.mI = %d ",c,m1.getI(),m2.getI()); } }; void run() { Test t1; t1.print(); } int main() { run(); return 0; }