c++能不能给类的成员变量在声明的时候初始化?

在C++11标准下,成员变量可在声明时初始化。这不同于构造函数初始化,且顺序为:声明初始化→初始化列表→构造函数。本文通过实例说明初始化顺序,并讨论其对类抽象性的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

能。可能早先的版本不能,但是c++11标准下能。有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化,如下代码:(另外初始化列表中初始化的顺序是和变量声明的顺序一样,而与列表中的顺序无关)

#include "stdafx.h"
  #include <iostream>
  using namespace std;
  class A 
  {
  public:
      int a = 1;
      A() {}
      A(int a_):a(a_){}
     A(int a_, bool b) :a(4) { a = a_; }
 };
 
 int main()
 {
     A a1, a2(3), a3(5, true);
     cout << "a1.a=" << a1.a << endl;
     cout << "a2.a=" << a2.a << endl;
     cout << "a3.a=" << a3.a << endl;
     system("pause");
     return 0;
 }

结果如图,可看出,初始化列表初始化的变量值会覆盖掉声明时初始化的值,而构造函数中初始化的值又会覆盖掉初始化列表的,足以看出初始化的顺序:

另外有人说这种初始化方式破坏了类的抽象性。是的,一定程度上,但是却能带来很大便捷。好比一台机器能够生产某种零件,零件的各个尺寸可以在一定程度任意改变,但是我们并不是每次生产这种零件都需要一个一个地给定每一个参数,然后再生产,机器会自己带有一套“默认”的零件尺寸参数,这样新手可以直接用默认参数生产,除非你知道每一个参数都是干啥的,否则没必要更改。那么也可以在构造函数中给出这一套“默认参数”啊,是的,但是假如你有10个构造函数,那么你每一个都要复制一次所有成员变量的默认参数吗?显然在做重复的无用工作,那么为什么不直接在声明的时候就初始化!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值