以下示例来自"Inside C++对象模型"一书
class Abstract_base {
public:
virtual ~Abstract_base () = 0;
virtual void interface () const = 0;
virtual const char* mumble () const
{
return _mumble;
}
protected:
char *_mumble;
};
Run Code Online (Sandbox Code Playgroud)
作者说如果我想初始化_mumble,那么应该实现纯虚基类的数据成员,一个"受保护的构造函数".
但为什么要保护?为什么"公共建设者"不适合这个班级?
谢谢你的回答,如果有一个例子,这将是完美的~~ :)
这是我的cpp代码.
#include <iostream>
using namespace std;
class A {
public:
int val;
char a;
};
class B: public A {
public:
char b;
};
class C: public B {
public:
char c;
};
int main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序的输出(在gcc中)是:
8
12
12
Run Code Online (Sandbox Code Playgroud)
这个输出让我很困惑.
我知道对齐可能是sizeof(A)等于8的原因.(sizeof(int) + sizeof(char) + 3 bytes padding)
我还猜测sizeof(B)(sizeof(B) == sizeof(A) + sizeof(char) + 3 bytes padding)的扩展是为了避免重置发生时的重叠.(是对的吗?)
但我真的不知道为什么sizeof(B)等于sizeof(C). …
在"Inside the C++ object model"一书中,作者说:
显式初始化列表有三个缺点:
只有当所有班级成员都是公开的时候才能使用它.
它只能指定常量表达式(能够在编译时进行评估的表达式).
3.因为它不是由编译器自动应用的,所以初始化对象失败的可能性显着提高.
我不知道为什么显式初始化列表更容易失败."编译器自动应用"的含义是什么?
是否有一些例子来证明这一观点.
感谢您的回答.
例如,
float a = 1.0;
float b = 1.2;
puts(a == b? "equal": "not equal");
Run Code Online (Sandbox Code Playgroud)
编译器是按位还是通过其他方法处理它?
(我知道通过"=="来确定浮点数的相等性不是一个好的选择,我只是想知道编译器如何处理这种情况.)