初始化成员列表 ——— 类的const成员和引用成员的初始化

class A

{

public:

     A(){};

  const int num;

  CString& s;

}

A::A()

{

  cout<<A con<<endl;

}

void main()

{

  A a;  

}

 

这是不过的,因为const成员变量需要在构造函数调用进入函数体之前就要被初始化,所以

C++有一种语法叫做 成员初始化列表。

构造函数改为

A::A():num(5):s(myString)

{

  cout<<A con<<endl;

}

这样const int num被初始化为5,s被初始化为myString。

只有构造函数有这个语法,并且const和引用必须这样初始化。

 

下面这种情况是一个类的成员变量是一个类对象。

#include "stdafx.h"

class ClassA
{
public:
	ClassA(int a)
	{
		m_a=a;
		printf("ClassA con");
	}
	int m_a;
};


class ClassB
{
public:
	ClassB();
	ClassA a;
};

ClassB::ClassB():a(2)
{
	printf("ClassB con");
}
int _tmain(int argc, _TCHAR* argv[])
{
	ClassB* b=new ClassB;
	return 0;
}

  因为ClassA已经提供了一个有参数的构造函数,编译器不再提供默认的无参构造函数。所以ClassB如果不初始化a对象的话,是编译不过去的

所以在ClassB的构造函数初始化了a对象。

转载于:https://www.cnblogs.com/Browneyes/p/6089358.html

### 如何使用 `const` 修饰符初始化成员变量 #### C++C++中,当声明一个成员变量为`const`时,该成员变量必须在其定义处或通过构造函数的初始化列表来赋初值。一旦被赋予初始值,则不能再改变其值。 对于非静态成员,在构造函数中利用初始化列表完成这一操作是最常见的做法[^1]: ```cpp class CExample { public: CExample() : m_a(1), m_b(2) {} private: const int m_a; int m_b; }; ``` 而对于整型静态常量数据成员而言,可以直接于体内指定默认值,这得益于这成员具有编译时常量性质的特点[^2]: ```cpp class ExampleWithStaticConstMember { public: static constexpr int s_value = 42; // 静态常量成员可以在此直接初始化 }; ``` 另外,自C++11起引入了更灵活的方式——允许直接在定义里给非静态成员设定初始值;不过需要注意的是,如果同时存在显式的初始化器(即初始化列表),那么后者会覆盖前者[^3]: ```cpp class Human { private: const std::string bloodType = "A"; // 初始化 }; ``` #### C# 相比之下,C#处理`const`字段的方式略有不同。在C#里面,`const`关键字用来创建真正的编译期常数,这意味着它的值不仅限定了不能更改,而且实际上是在程序运行前就已经确定下来并嵌入到最终生成的IL代码中的。因此,所有的`const`字段都必须立即给出具体的数值表达式作为其值,并且这个表达式应该能够完全由编译器计算得出结果。 下面是一个简单的例子展示如何在C#中定义使用`const`: ```csharp public class Person { public const string BloodType = "O"; } ``` 值得注意的是,在C#中不存在像C++那样的初始化列表机制,所以任何需要动态决定的只读(`readonly`)而非真正意义上的常量(`const`)属性应当采用其他方式实现,比如通过构造函数参数传递并在实例化对象的时候设置相应的私有字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值