- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到了两种使用成员初始化列表的不同方式。第一个是这样的:
class ClassName {
public:
arg_type_1 varName1;
arg_type_2 varName2;
// Constructor.
ClassName(arg_type_1 arg_name_1, arg_type_2 arg_name_2)
: varName1(arg_name_1), varName2(arg_name_2)
{
}
}
那里发生的事情很清楚。在构造函数中,我们有一个参数列表,我们使用它们来初始化类的成员。例如arg_name_1
用于初始化 varName1
的值类的变量。
另一种使用成员初始化器的方式出现在继承的情况下:
class ChildClass : public ParentClass
{
ChildClass(string name) : ParentClass( name )
{
// What can we put here and why we might need it.
}
};
这里发生的事情也很清楚。当我们调用 ChildClass
的构造函数时使用一个字符串参数,它调用 ParentClass
的构造函数使用相同的字符串参数。
我不清楚的是编译器如何区分这两种情况(语法相同)。例如,在第二个示例中,编译器可能认为它需要获取 name
的值。变量并将其分配给 ParentClass
ChildClass
的变量然后它看到这样一个变量没有在 ChildClass
中声明.
我不明白的第二点是为什么我们可能想把一些内容放在第二个例子的构造函数的主体中。即使没有任何东西,它也已经使用父类的构造函数创建并返回一个对象。
最佳答案
What is not clear to me, is how compiler distinguish these two cases (the syntax is the same).
看到列表中的初始化器,编译器首先查找具有该名称的成员变量。如果找到一个,它会尝试用给定的参数初始化该成员。如果没有,它会查找具有该名称的直接基类或虚拟基类,以使用给定参数初始化基类子对象。这些是在类的方法(包括构造函数)中命名某些内容时应用的常用名称查找规则。
在罕见且设计糟糕的情况下,当您同时拥有同名的成员变量和直接基类时,您将必须限定基类类型,即添加命名空间:
struct B1 {
B1(char const*) {};
};
namespace Foo {
struct B2 {
B2(bool) {};
};
}
struct Weird : public B1, public Foo::B2 {
int B1;
double B2;
Weird()
: ::B1("meow")
, Foo::B2(false)
, B1(42)
, B2(3.14)
{}
};
The second unclear point to me is why we might want to put some content in the body of the constructor from the second example. Even of there is nothing it already creates and returns an object using the constructor of the parent class.
它实际上并没有返回任何对象,它只是创建了那个对象。但是,有人可能想像这样调用其他函数:
class ParentClass {
public:
ParentClass(string name);
void registerSomething(ParentClass const&);
}
class ChildClass : public ParentClass {
public:
ChildClass(string name) : ParentClass( name ) {
registerSomething(*this);
}
};
有人想要这样做的原因可能有很多。一般来说,由于子类比父类“多”一些,所以如果它想在其构造函数中做更多的事情而不仅仅是初始化基类子对象,那是很自然的。
关于对象生命周期的一些话:在进入构造函数体之前,你只构造了新对象的子对象。当执行离开构造函数主体时,对象本身开始其生命周期。打个比方,汽车及其零件:在进入汽车的构造体之前,您已经给轮胎充气、组装发动机并冲压出车身部件。但是你的车如果没有组装就不是汽车,这发生在构造函数的主体中。这反射(reflect)在析构函数中,尤其是在存在异常时可以看到:如果在对象的构造函数期间发生异常,则不会调用其析构函数。只会调用已经完全构建的子对象的析构函数。这是因为如果构造函数没有完成执行,对象就不会存在,也没有什么可以调用析构函数。
关于c++ - C++ 中是否有两种类型的成员初始值设定项列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248794/
test = (function(){var key = 200; return {getKey : function(){return key} }; })(); test.
如果这个问题可能一直被问到,我很抱歉,但我进行了搜索,但找不到足够的答案。 如果公共(public)成员/方法正在访问私有(private)成员/字段,如何禁用它们的继承? 所以考虑一下: publi
重要的澄清:一些评论者似乎认为我是从 union 复制的。仔细查看 memcpy,它从一个普通的旧 uint32_t 地址复制而来,该地址不包含在 union 中。另外,我正在(通过 memcpy)复
spinner 通常只显示一个字符串,在我想分配 IDpersonne 和 Name 的情况下,旋转器必须告诉我名字。当我得到选定的项目时,我必须得到 ID。我该怎么做? 最佳答案 我假设您已将项目排
A 类的实例是 B 类的公共(public)成员。B 类的实例也是 A 的公共(public)成员。在什么情况下可能需要这种实现?我的意思是是否有一个或多个标准场景需要这种实现方式?更具体的细节:我有
我如何设置我的 web.config 以使用表单例份验证,将成员身份提供程序设置为 ActiveDirectoryMembershipProvider 并使用内置登录控件。这样我就可以使用有效的事件目
这个问题已经有答案了: Should methods in a Java interface be declared with or without a public access modifier?
因此根据定义,类中的私有(private)数字在序列化时以类名作为前缀。这对我来说是一个问题,我希望能够序列化/保存/反序列化一个确切的对象,但是 php 所做的是给我另一个 classname+va
我实现了一个成员? clojure 中的函数如下: (defn member? [item seq] (cond (empty? seq) false (= item (first
我在这里的问题似乎总是与使用函数有关。它仍然让我困惑!在本教科书练习中,我被要求按值传递结构,然后调整它并按引用传递。最初我设计的代码是在 main 中完成所有工作。现在我正在传递值。所以我添加了新函
所以我有这些变量 List files, images = new List(); string rootStr; 还有这个线程函数 private static int[] thread_searc
我对 C++ 模板和尝试弄清楚部分模板特化还比较陌生。我正在使用模板实现几个相关的数据结构:用于概率存在/不存在查询的布隆过滤器(基于位数组),以及用于丰度查询的计数布隆过滤器(带有整数数组)。我从以
例如在 java 中,我在外部类和内部类中声明并初始化了一个 JButton,我决定在某些情况下将其隐藏,这是一种安全的编程实践吗? 最佳答案 内部类的全部目的是它们可以访问到环绕内部类的外部类。 所
我有一个使用库进行通信的类: class Topic { Topic( Type T, String name ); }; class Reader { Reader (Topic, Stri
我在两个单独的文件中有以下代码。 package animal; public class Frog { protected void ribbit() { Syste
我有一个分数列表。使用这些,我需要从 redis 排序集中提取值。 我知道我可以使用 zrangebyscore - 但如果我提供的列表中的分数不连续怎么办?在这种情况下,我不能依赖 zrangeby
过去几年我一直被 C# 编码宠坏了,现在我又回到了 C++ 并发现我在处理本应很简单的东西时遇到了麻烦。我正在为 gamedev 使用名为 DarkGDK 的第三方库(任何以 db 为前缀的命令),但
我正在关注 Brian Harvey 从 2011 年开始在 UC Berkeley site 上的 SICP 讲座。 .他正在使用 STk interpreter教这门课,我正在使用带有 DrRac
在这段代码中,为什么在运算符重载中无法访问我的类的私有(private)字段? (请注意,这只是一个 MRE,不是完整代码) template class Frac template Frac o
在命名命名空间类中,我将一个类(位于全局命名空间中)声明为友元。 但是,后一个类不能访问前一个类的私有(private)成员。为什么是这样?有什么办法可以解决吗? Bob.h namespace AB
我是一名优秀的程序员,十分优秀!