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->Age
或cPerson::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 ++类构造函数设置变量这两种方式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章