#include<iostream>
using namespace std;
class A
{
private:
int x;
public:
A():x(0){ cout << "Construct A----" << x << endl; }
A(int i):x(i){ cout << "Construct A----" << x << endl; }
~A() { cout << "Des A----" << x << endl; }
};
class B
{
private:
int y;
public:
B():y(0){ cout << "Construct B----" << y << endl; }
B(int i):y(i){ cout << "Construct B----" << y << endl; }
~B() { cout << "Des B----" << y << endl; }
};
class C
{
private:
int z;
public:
C(int i):z(i){ cout << "Construct C----" << z << endl; }
~C() { cout << "Des C----" << z << endl; }
};
class D:public B
{
public:
A a0, a4; // l1
B b2, b1; // l2
C c1, c2; // l3 //其构造函数调用次序与这里的顺序有关
D():c2(2), c1(1), a4(4),B(1), b2(3) { cout << "Construct D----5" << endl; } //B(i)调用的是D的基类构造函数,它首先开始
~D(){ cout << "Des D----5" << endl; }
};
int main()
{
D d;
}
当然了,首先调用基类的构造函数是不容置疑的,不管它在哪里,记住即可,不过关于对象成员的构造函数的调用还需注意, 见 L1, L2, L3, 它们的构造函数的调用次序与它们在此的相对次序有关,如类A排在第一行,因此先调用关于它的对象,这里还应再注意一点,尽管先定义了它的对象成员,不过它不会立即调用其默认构造函数,而是去看看你有没有写相应的初始化(注意:这里是指在类里面,而不是指main函数内以及类外函数,对于类外函数应注意,在定义类的同时必须给它附上一定的值,不过这根据需要而定,如果你已经设置了无参构造函数了或者你在类内定义了一些set函数),比如调用完基类构造函数后优先调用a0的构造函数,但初始化列表中并没有它,故调用它的默认构造函数,然后调用a4的构造函数,依此类推,就不难理解编译运行后的结果了。
关于析构函数的调用只需知道它与构造函数的调用刚好对称即可。
针对继承,其构造函数的一般调用顺序为基类构造函数 ---> 成员对象的构造函数 ---> 它自身的构造函数(这里是指初始化列表后大括号内的内容)
class Base
{
public:
int x = 0;
protected:
double y = 0;
private:
float z = 0;
friend class Deri;
};
class Deri:public Base
{
protected:
int dx = 1;
public:
friend void f2(Base b);
void f3(Base b){cout << b.x << " " << b.y << " " << b.z << endl; } //在友元类内部可以访问另一个类私有成员
};
void f2(Base b)
{
cout << "======" << endl;
cout << b.x << " " << b.y << " " << b.z<< endl; //error, y和z都无法访问
}
如
class First1
{
private:
int memi;
double memd;
public:
int memi(){return memi;} //error
double getmemd(){return memd;}
};
#include<iostream>
using namespace std;
class First1
{
private:
double memd;
public:
double getmemd(){return memd;}
};
int main()
{
First1 a;
cout << a.getmemd() << endl;
}
#include<iostream>
using namespace std;
class Data
{
private:
int d;
public:
Data():d(0){}
Data(const int dd):d(dd){}
Data operator+(Data b)
{
Data c = d + b.d;
return c;
/*
int c = d + b.d;
return Data(c); //true,和下面一样
Data c_(c);
return c_; //true
*/
}
friend ostream &operator<<(ostream& os, const Data &b);
};
ostream& operator<<(ostream& os, const Data &b)
{
os << b.d;
return os;
}
int main()
{
Data a, b(1);
cout << a + b << endl;
return 0;
}
T operator + (const Data<T> d) {
return value + d.value;
} /*这是一个类模板内的一个成员函数,注意人家
在使用类对象时显示的指定模板实参了,不要忘了,另外系统隐藏了一个
类对象,一般两个对象中隐藏第一个*/
friend Complex operator+(Complex a, double b) {return Complex(a.r + b, a.i); /*这里定义成友元函数比较好*/
/*注意:写成这样就不对了*/
//例如
Complex(Complex a, Complex b){} /*如果你想得到a和b相加后的结果,这样写是不对的,因为多了一个*/
/*应写成这样*/
Complex(Complex b)
{
Complex c;
...
return c(...);
}
friend X& operator++(X& o); /*相当于++a,自增完后直接返回引用*/
/*或者这样*/ X& operator++(); /*相当于++a,自增完后直接返回引用*/
friend X operator++(X& o, int ); /*相当于a++,自增完后返回一个临时的*/
class Circle
{
private:
double x, y, r;
public:
Circle(double a, double b, double c):x(a), y(b), r(c){}
operator int(){return int(r);}
};