#include <iostream> using namespace std; class a{ public: a(){ value ++; cout <<"default a"<<endl; } a(const a&){ value ++; cout <<"const a"<<endl; } a operator=(const a& a1){ cout <<"operator ="<<endl; return a(a1); } void f(){ cout <<"value is "<<value <<endl; } ~a(){ cout <<"~a"<<endl; } private: static int value; }; int a::value = 0; void f1(a a1){ a1.f(); cout <<"f1"<<endl; } a f2(){ cout <<"f2"<<endl; return a(); } void f3(){ a a1,a2; f1(a1); a2 = f2(); } int main(){ f3(); return 0; }
结果是
default a f3内的a1调用构造函数
default a f3内的a2调用构造函数
const a f1内的的a变量以a1为参数调用构造函数
value is 3 此时有三个a对象了,所以value为3
f1 打印输出f1
~a f1内的的局部变量退出了作用域,此时调用析构函数
f2 f2内打印输出f2
default a f2调用默认构造函数
operator = f2在f3内因为调用=这个运算符,所以才会打印输出
const a
~a
~a
~a
~a
这个其实有问题的,一般而言,有赋值的必须返回*this(=,+=,-=等等)
类似下面这个
#include <iostream> using namespace std; class a{ public: a(){ value ++; cout <<"default a"<<endl; } a(const a&){ value ++; cout <<"const a"<<endl; } a& operator=(const a& a1){ cout <<"operator ="<<endl; return *this; } void f(){ cout <<"value is "<<value <<endl; } ~a(){ cout <<"~a"<<endl; } private: static int value; }; int a::value = 0; void f1(a a1){ a1.f(); cout <<"f1"<<endl; } a f2(){ cout <<"f2"<<endl; return a(); } void f3(){ a a1,a2; f1(a1); a2 = f2(); } int main(){ f3(); return 0; }
4 class a{ 5 public: 6 a(int i):value(i){} 7 ~a(){cout <<"~a"<<endl;} 8 a& operator=(const a& a1){ 9 this->value = a1.value; 10 return *this; 11 } 12 int get(){return value;} 13 private: 14 int value; 15 };
最好的方法,=,+=,-=,等等这些符号绝对不能导致构造函数,
记住此时
a a1=10;
此时调用的是构造函数虽然用的符号是=这个符号,这一点必须高清晰
结果为
default a
default a
const a
value is 3
f1
~a
f2
default a
operator =
~a
~a
~a