一、C++
1、不存在继承时候类的实例化顺序:
先声明/初始化类中变量,再执行构造函数
变量的声明/初始化顺序又按照先静态再非静态
无论创建几个对象, 该类的静态成员只构建一次, 所以静态成员的构造函数只调用1次
class MyClass
{
public MyClass(int a) //3. 然后才是执行构造函数
{
val = a;
}
public int val = 20; //1. 首先声明int型变量val并赋值20
public int i = 10; //2. 其次声明int型变量 i 并赋值10
}
int main()
{
MyClass a1 = new MyClass(201); //0.声明MyClass类型对象a1,并调用构造函数进行实例化
return 0;
}
2、存在继承时候类的实例化顺序:
静态数据成员的构造函数 -> 父类的构造函数 ->
非静态的数据成员的构造函数 -> 自己的构造函数
#include <iostream>
#include <Windows.h>
using namespace std;
class M{
public:
M(){
cout << __FUNCTION__ << "uuu"<<endl;}
M(int x,int y){
cout << __FUNCTION__ << "uuu"<<endl;this->x=x;this->y=y;}
};
class N{
public:
N(){
cout << __FUNCTION__ << endl;}
};
class A{
public:
A(){
cout << __FUNCTION__ << endl;}
};
class B :public A{
public:
B(){
cout << __FUNCTION__ << endl;}
private:
M m1;
M m2=M(1,1);
static N ms;
};
N B::ms; /* 静态成员 */
int main(){
B b;
system("pause");
return 0;
}
运行结果
N::N 静态数据成员的构造函数
A::A 父类的构造函数
M::M 非静态数据成员的构造函数 uuu
M::M 非静态数据成员的构造函数 vvv
B::B 自己的构造函数
最先输出的是静态N 即使静态N在非静态m1,m2之后
另外需要注意对非静态数据成员赋初值在C++ 11 以后才支持
M m2=M(1,1)这行代码会出警告:
[Warning] non-static data member initializers only available
with -std=c++11 or -std=gnu++11
3、父类的多个构造函数子类实例化时调用哪个
子类无参构造 调用父类无参构造
#include <iostream>
using namespace std;
class A{
public:
int a;
int b;
A(){
cout<<"A Constructed\n";}
};
class B:A{
public:
int c;
int d;
B(){
cout<<"B Constructed\n";}
};
int main(){
B b;
return 0;
}
运行结果
A Constructed
B Constructed
子类B有参构造函,仍调用父类A的无参构造 即使父类存在和子类构造参数匹配的构造函数
#include <iostream>
using namespace std;
class A{
public:
int a;
int b;
A(){
cout<<"A Constructed 1\n"; }
A(