C++ 奇异多态性c++;?

C++ 奇异多态性c++;?,c++,polymorphism,C++,Polymorphism,有人能给我解释一下这行代码中奇怪的地方吗 ClassA::ClassA(std::string aName):name(aName) 显然,这是该类的声明 class ClassA { public: std::string name; ClassA(std::string aName); }; 奇怪的代码行出现在它的cpp文件中 ClassA::ClassA(std::string aName) : name(aName) 不对?但是,那是什么呢?这只是初始化列表。指定构造

有人能给我解释一下这行代码中奇怪的地方吗

ClassA::ClassA(std::string aName):name(aName)

显然,这是该类的声明

class ClassA
{
public:
    std::string name;
    ClassA(std::string aName);
};
奇怪的代码行出现在它的cpp文件中

ClassA::ClassA(std::string aName) : name(aName)

不对?但是,那是什么呢?

这只是初始化列表。指定构造函数时,可以在此列表中初始化成员变量。

这是一个具有初始化列表的构造函数:

 ClassA::ClassA(std::string aName) 
 : name(aName) // constructor initialization list
 {
   // ctor body. name is already initialized here
 }
这意味着数据成员
name
使用
aName
的值进行初始化


它与多态性正交。

它是成员初始值设定项。成员

std::string name;
将使用
aName

使用它可以跳过std::string的默认构造函数,否则将使用该构造函数,因此这会减少一些开销。另一个选择是

ClassA::ClassA(std::string aName)
{
  // name is fist constucted with default constructor
  name = aName;  // value is assigned with operator =
}

这通常比较慢,应该避免,它是一种在C++中初始化成员变量的简洁明了的方法,这是一个成员初始值设定项列表,与多态性无关。它初始化成员<代码>名称>代码>值>代码> AnAs<代码> @用户,也许你可以拿起一本“24小时学习C++”的书,阅读第1章。或者更好的方法是,检查一下,这样我就可以假设它相当于在类声明权限中将“name”声明为数据成员。但如果是这样,那么数据成员的范围是什么?private?@user2345939它不是等效的<代码>名称必须是数据成员(或基类)。您正在初始化
名称
private
public
protected
在这里不重要,也可以是。不,这不声明成员,它只是初始化它。它仍然必须在类定义中声明。你是对的。我只是快速研究了一下成员初始值设定项,发现在类内初始化数据成员实际上效率较低