类(四)C++、Java、Python中属性、构造方法初始化顺序、父类子类构造方法调用顺序、初始化参数列表

本文详细探讨了C++、Java和Python中类的属性、构造方法初始化顺序,以及父类子类构造方法调用规则。在C++中,类实例化顺序包括静态成员、父类构造、非静态成员和自身构造。Java的规则与C++类似,但通过super调用父类构造。Python的相关内容请参考链接。同时,还分析了C++中初始化参数列表的使用场景。
摘要由CSDN通过智能技术生成

一、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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值