C ++类构造函数设置变量这两种方式有啥区别?

Posted

技术标签:

【中文标题】C ++类构造函数设置变量这两种方式有啥区别?【英文标题】:C++ Class Contructor setting Variables whats the difference between those tho ways?C ++类构造函数设置变量这两种方式有什么区别? 【发布时间】:2018-01-10 10:17:21 【问题描述】:

首先是示例代码:

cPerson.h:

#pragma once
class cPerson

public:
    cPerson();
    ~cPerson();
    int Age;
;

cPerson.cpp

#include "cPerson.h"

cPerson::cPerson()

    this->Age = 3; // Way 1
    cPerson::Age = 4; // Way 2


cPerson::~cPerson()  

好的,现在我的问题:

如果我们在 C++ 中定义一个新类,有两种方法可以设置初始值。有(方式 1)使用“this”指针,或(方式 2)使用范围运算符( :: )。 在学校里,我用“this->”学会了它。现在,在不使用 C++ 多年后,我再次开始使用它并找到了第二种方法,即使用范围运算符。 两种方式都可以正常工作,但是它们之间的确切区别是什么以及“更快”/“更好”的方式是什么?如果我正在编程,我就是那种喜欢知道我的 ram/cpu 到底发生了什么的人。

所以我希望有人可以帮助我,并提前感谢。

【问题讨论】:

您可以简单地编写 Age = 3; 或更好地使用 Bathsheba 提到的成员初始化器列表。大多数时候,你不应该限定你的班级成员,所以你应该直接使用Age而不是this->AgecPerson::Age 在您的特定示例中,没有区别。通常,编译器将以相同的方式处理它们。还有其他方法。 在类名前加上c 不是最好的主意 @PasserBy:为什么? 这是多余的信息,会妨碍。当读者看到周围的上下文时,他们将能够看到名称是一种类型。你不会Person jonskeet;误认为是别的东西 【参考方案1】:

构造函数的更好写法

cPerson::cPerson() : Age(3)


从那时起,您可以构造对象的const 实例。考虑以小写字母开头Age:这会更传统。

您可以通过编写更简洁的Age = 3; 来改进您的第一种方式:如果它们依赖于复杂计算的结果,有时在构造函数主体中初始化成员是不可避免的。

使用:: 是特殊的:如果成员在基类中定义,则使用范围解析运算符将失败。但它确实偶尔使用,特别是如果您需要消除 shadowed 基类成员的歧义。

最后,从 C++11 开始,您可以将类简化为

struct cPerson

    int Age = 3;
;

见C++11 allows in-class initialization of non-static and non-const members. What changed?

【讨论】:

不错的坦克答案。我期待 C++11 以某种方式参与其中。我只是找不到任何信息。你的链接是一个很好的信息来源,坦克。是的,在这种情况下,简化将是一件好事。尽管这只是一个例子。

以上是关于C ++类构造函数设置变量这两种方式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C++类成员冒号初始化以及构造函数内赋值

装配SpringBean--依赖注入

c++ 拷贝构造函数与赋值运算符重载函数的区别是

声明构造函数私有和 =delete 有啥区别?

构造函数和原型

使用构造函数与 state = 在反应组件中声明状态有啥区别?