如果我声明了一个基类(或接口类)并为其一个或多个参数指定了一个默认值,那么派生类是否必须指定相同的默认值,如果没有,哪些默认值将在派生类中显示?
附录:我也对如何在不同的编译器中处理这个问题以及在这种情况下对"推荐"实践的任何输入感兴趣.
根据C++'03标准2.3/1:
在进行任何其他处理之前,每个出现的以下三个字符序列之一("三字符序列")被表1中指示的单个字符替换.
Run Code Online (Sandbox Code Playgroud)---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
在现实生活中,这意味着代码printf( "What??!\n" );将导致打印,What|因为??!是一个被|字符替换的三字符序列.
我的问题是使用三字母的目的是什么?使用三字母有什么实际优势吗?
UPD:在答案中提到一些欧洲键盘没有所有标点字符,所以非美国程序员必须在日常生活中使用三字母组合?
UPD2:Visual Studio 2010默认情况下关闭了三字母支持.
可以编写一个函数,当用C编译器编译时它将返回0,并且当用C++编译器编译时,将返回1(微不足道的
#ifdef __cplusplus情况并不令人感兴趣).
例如:
int isCPP()
{
return sizeof(char) == sizeof 'c';
}
Run Code Online (Sandbox Code Playgroud)
当然,只有在sizeof (char)不相同的情况下才会起作用sizeof (int)
另一个更便携的解决方案是这样的:
int isCPP()
{
typedef int T;
{
struct T
{
int a[2];
};
return sizeof(T) == sizeof(struct T);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这些例子是否100%正确,但你明白了.我相信还有其他方法可以编写相同的功能.
在运行时可以检测到C++ 03和C++ 11之间有什么区别?换句话说,是否有可能编写一个类似的函数,它返回一个布尔值,表明它是由符合标准的C++ 03编译器还是C++ 11编译器编译的?
bool isCpp11()
{
//???
}
Run Code Online (Sandbox Code Playgroud) 请注意,此问题最初发布于2009年,在C++ 11批准之前以及
auto关键字的含义发生重大变化之前.提供的答案仅适用于C++ 03的含义auto- 即指定的存储类 - 而不是C++ 11的含义auto- 即自动类型推导.如果您正在寻找有关何时使用C++ 11的建议auto,则此问题与该问题无关.
在最长的时间里,我认为没有理由static在C中使用关键字,因为在块范围之外声明的变量是隐式全局的.然后我发现static在块范围内声明一个变量会给它一个永久的持续时间,并且在块范围之外(在程序范围内)声明它会给它文件范围(只能在该编译单元中访问).
所以这给我留下了一个我可能还没有完全理解的auto关键字:关键字.除了"局部变量"之外还有其他一些含义吗?无论你想在哪里使用它,它都没有隐含地为你做的事情?auto变量如何在程序范围内表现?static auto文件范围中的变量是什么?此关键字除完全性之外是否还有其他目的?
我对value-&default-&zero-initialization非常困惑.特别是当他们参与不同的标准C++ 03和C++ 11(和C++ 14)时.
我引用并试图在这里扩展一个非常好的答案Value-/Default-/Zero-初始化C++ 98和C++ 03,以使其更加通用,因为它可以帮助很多用户,如果有人可以帮助填写需要差距,以便对何时发生的情况有一个很好的概述?
通过示例的全面见解简而言之:
有时新运算符返回的内存将被初始化,有时它不会取决于您正在新建的类型是POD(普通旧数据),还是它是一个包含POD成员且正在使用的类编译器生成的默认构造函数.
假设:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { …Run Code Online (Sandbox Code Playgroud) 我在C++中有以下类:
class a {
const int b[2];
// other stuff follows
// and here's the constructor
a(void);
}
Run Code Online (Sandbox Code Playgroud)
问题是,如何在初始化列表中初始化b,因为我无法在构造函数体内初始化它,因为b是const?
这不起作用:
a::a(void) :
b([2,3])
{
// other initialization stuff
}
Run Code Online (Sandbox Code Playgroud)
编辑:这个例子就是我可以b为不同的实例设置不同的值,但是已知这些值在实例的生命周期内是不变的.
我正在使用一个API,要求我将函数指针作为回调传递.我正在尝试从我的类中使用此API,但是我遇到了编译错误.
这是我从构造函数中做的:
m_cRedundencyManager->Init(this->RedundencyManagerCallBack);
Run Code Online (Sandbox Code Playgroud)
这不编译 - 我收到以下错误:
错误8错误C3867:'CLoggersInfra :: RedundencyManagerCallBack':函数调用缺少参数列表; 使用'&CLoggersInfra :: RedundencyManagerCallBack'创建指向成员的指针
我尝试使用这个建议&CLoggersInfra::RedundencyManagerCallBack- 对我不起作用.
对此有何建议/解释?
我正在使用VS2008.
谢谢!!
TTBOMK,有三种方法可以在C++中初始化变量.
int x = 0; // C-like initialization
int x (0); // Constructor initialization
int x {0}; // Uniform initialization
Run Code Online (Sandbox Code Playgroud)
为C++ 11引入了统一初始化,以便为初始化不同类型的变量提供更加统一的语法,这需要在C++ 03中使用不同的语法.
C-like,构造函数和统一初始化之间有什么区别?我应该总是使用统一初始化吗?
以下代码在C++ 98,C++ 11和C++ 14模式下对我尝试的所有GCC版本产生后续编译错误:
struct T
{
T(void* x) : (x) {}
};
// main.cpp: In constructor 'T::T(void*)':
// main.cpp:3:18: error: anachronistic old-style base class initializer [-fpermissive]
// T(void* x) : (x) {}
// ^
// main.cpp:3:16: error: unnamed initializer for 'T', which has no base classes
// T(void* x) : (x) {}
Run Code Online (Sandbox Code Playgroud)
当然,它显然是破碎的代码,因为我实际上并没有初始化任何东西.
但为什么它是基类初始化器,为什么它是"不合时宜的",而不是简单的错误?曾经有效吗?什么时候?这是什么意思?
我在网上找到的唯一的相关参考文献是,当一个成员名称被意外地宏出时,人们遇到了错误,实际上产生了与上面相同的代码:
#define bar
// ^ some library could have done this
struct T
{
T(int x)
: bar(x) // effectively just `: …Run Code Online (Sandbox Code Playgroud)