C++中默认构造函数和复制构造函数需要特殊理解。
目前来看,复制构造函数可能也会因为编译器的不同体现出不同的调用机制。
以下程序创建了一个只含有基本数据类型的类,可以一定程度上帮助你理解c++中的构造函数。
#include// 需要使用std::cout、std::endl using namespace std; // 将std::cout、std::endl分别缩写为cout和endl //vec是向量vector的缩写,表示一个二位向量 //因为c++中有一个名为vector的模板,所以,不用那个名字 class vec{ private: double x, y; public: // 默认构造函数,如果默认构造函数什么都不做的话等于没写(意思就是没写也行) vec() { cout << "Default constructor has constructed. "<< endl; } vec(double xx, double yy) : x(xx), y(yy) { cout << "A constructor has constructed (" << this->x << "," << this->y << "). " << endl; } // 复制构造函数(特征只有一个参数,是同类对象的引用或常引用,即vec &b或者是const dot &b) vec(const vec &b) : x(b.x), y(b.y) { cout << "Copy constructor has constructed (" << this->x << "," << this->y << "). " << endl; } //x,y属性是private,外界不能直接调用,也就是说声明vec a没法直接用a.x和a.y //于是你需要用a.X()和a.Y()来获取a的属性,至于为什么要这么蛋疼,这是学计算机面的搞面对对象变成才需要去搞懂的 double X() { return this->x; } double Y() { return this->y; } //以下是对运算符的重载,如果不考的话你不需要了解,写这些是为了让二维向量更像二维向量 vec operator+(vec AnotherVector) { return vec(this->x + AnotherVector.x, this->y + AnotherVector.y); }//加法 vec operator-(vec AnotherVector) { return vec(this->x - AnotherVector.x, this->y - AnotherVector.y); }//减法 vec operator+() { return *this; }//正号 vec operator-() { return vec(-(this->x), -(this->y)); }//负号 vec operator*(double times) { return vec(times * (this->x), times * (this->y)); }//右乘,即乘数只能在乘号右边 }; int main(int argn,char** agrv){ //你可以直接用构造函数表示该类型变量的一个值:vec(1,2)表示二维向量(1,2),这就好像你可以用数字“1”表示一个int。 // 如果说这样还有点抽象,你可以认为int a=1 和 vec b=vec(1,2)的意义是差不多的。 vec a = vec(1, 2); //用(1,2)初始化a向量 你可以使用vec a(1,2);效果是完全一样的。 cout << "line 65: a is (" << a.X() << "," << a.Y() << "). " << endl; // 每一个输出都写明了当前所在代码行数,观察确定行数之间的输出会更加清晰。 vec b; //等价于vec b(); b = vec(3, 4);//给向量b赋值,可以注意到a和b做了一样的事情,构造函数调用却有区别,自然的,你在这里不可以用b(3,4) cout << "line 71: b is (" << b.X() << "," << b.Y() << "). " << endl; // 如果你能搞明白运算符重载,那就可以明白为什么这里调用了一次复制构造函数,否则不需要理解 a = (-(+a) + (-vec(1, 2) + (+vec(2, 0)))) - b * 2; //这一行的代码是告诉读者:经过运算符重载后这样写是可以的,你可以用高中知识进行计算,看看是否相等 cout << "line 76: a is (" << a.X() << "," << a.Y() << "). " << endl; a = b; cout << "line 80: a is (" << a.X() << "," << a.Y() << "). " << endl; cout << "line 81: b is (" << b.X() << "," << b.Y() << "). " << endl; return 0; }



