C++成员变量初始化

在我们定义一个类时,通常都会这样设定成员变量:

class Point{
    
    int x;
    int y;
};
...
Point p;

我们可以看到,当我们创建一个 Point 对象 p 的时候,p的成员变量有时候被初始化为0,有时候不会。在有的语言环境里面,并不存在无初值对象,那么当成员变量没有手动初始化的时候,很可能让程序终止运行。

所以,我们通常会在定义某个变量的时候就进行初始化。

int x = 0;
char* name = "Mike";

但是,当我们在定义一个类时,初始化的任务通常都是由构造函数完成的。通常,我们会在构造函数中进行一个赋值操作,请注意,是赋值操作:

#include<iostream>
#include<stirng>
using namespace std;

class Person{
public:
    Person(int age, string name, string address);

private:
    int m_age;
    string m_name;
    string m_address;
};

Person::Person(int age, string name, string address){

    m_age; = age;        //(这些都是赋值,不是初始化)
    m_name = name;
    m_address = address;
}

这会导致Person对象确实可以带有你指定的值,但这并不是最佳的做法。因为C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。也就是说,在进入构造函数本体之前,agename address, 都已经被初始化了,这个初始化发生在这些成员的 default 构造函数被自动调用的时候。因此,这种形式的构造函数并不是一个初始化操作,本质上他是一个赋值操作。

而构造函数的一个比较好的写法是,使用 member intialization list(成员初值列) 替换赋值操作。

Person::Person(int age, string name, string address) :
    m_age(age), m_name(name), m_address(address)    //这些都是初始化
 { }    //本体不需任何操作

这个构造函数的最终结果与上一个的最终结果相同,但通常效率较高。

基于赋值的构造函数首先调用 default 构造函数为 agename address 设初值,然后立刻对他们赋予新值。default 构造函数的付出就被浪费了。而成员初值列的做法避免了这一问题,因为初值列中针对各个成员变量设置的实参,被拿去作为各成员变量之构造函数的实参。这个例子中,m_age age 作为初值进行 copy 构造,m_name name 作为初值进行 copy 构造,m_addressaddress 作为初值进行 copy 构造。

对于大多数类型来说,比起先调用 default 构造函数然后再调用 copy assignment 操作符(也就是赋值操作),单独只调用一次 copy 构造函数是比较高效的, 有时甚至高效得多。而在我们使用成员初值列的时候,成员变量的顺序应该与它们在 class 中的声明次序相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值