在多级继承中,我可以在继承层次结构中重写基类中的虚函数吗?举个例子
class Base {
public :
virtual void method1();
///
}
class Derived1 : Base {
public :
void method2();
}
class Derived2 : Derived1 {
public :
void method1();
}
Run Code Online (Sandbox Code Playgroud)
我可以使用多态性访问 Derived2::method1() 吗?
Base* myClass = new Derived2();
myClass->method1();
Run Code Online (Sandbox Code Playgroud) 我说得对不对明白,这些都是最低值__cplusplusC与++ 98具有相同的值有C ++ 03?
// C++ 98
#define __cplusplus 199711L
// C++ 03
#define __cplusplus 199711L
// C++ 11
#define __cplusplus 201103L
// C++ 14
#define __cplusplus 201402L
// C++ 17
#define __cplusplus 201500L
// C++ 20
#define __cplusplus 201704L
// looks like the format is YEAR*100+something
Run Code Online (Sandbox Code Playgroud)
另外,既然标准已经发布,C++20 是否具有官方价值?
N2431是介绍的论文nullptr。它说:
当前的 C++ 标准提供了一个特殊规则,即 0 既是整数常量又是空指针常量。来自 [C++03] 条款 4.10:
空指针常量是整数类型的整数常量表达式 (expr.const) 右值,其计算结果为零。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且与指向对象的指针或指向函数类型的指针的所有其他值区分开来。相同类型的两个空指针值比较相等。将空指针常量转换为指向 cv 限定类型的指针是一次转换,而不是指针转换后跟限定转换 (conv.qual) 的序列。
此公式基于原始 K&R C 定义,与 C89 和 C99 中的定义不同。C 标准 [C99] 说(第 6.3.2.3 条):
值为 0 的整数常量表达式,或转换为 void * 类型的此类表达式,称为空指针常量。 [55] 如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针不相等。
让我们忽略“[c++03] 公式是基于原始的 K&R C 定义”部分而关注“[c++03 公式] 与 [...] C99 中的定义不同”。
我不清楚 C++03 和 C99 定义在哪些方面有所不同。是的,它们在书面标准中有不同的正式定义(正如我们所看到的引用不同),但从实践的角度来看,这意味着什么?他们真的有区别吗?如果我正确阅读这篇文章,它的语气暗示存在差异。如果有,它们是什么?我无法理解/理解基于标准引用的差异。
我没有具体询问 C++03 或 C99 空指针是如何定义、表示和/或实现的。我的问题是关于 C++03 和 C99 空指针定义(可能还有它们的实现,如果为了回答这个问题而进行演示很重要)有何不同,答案可以包含 C++03 和C99 空指针,但仅作为说明差异或显示差异的帮助点。也就是说,仅提供定义或对每个定义的解释不被视为对这个问题的回答。
我完全知道这nullptr是在 C++11 及更高版本中表达空指针的首选方式。这不是问题。
我想arr为std::array<T, 32>.
template<typename T>
using arr = std::array<T, 32>;
Run Code Online (Sandbox Code Playgroud)
但是,它不适用于仅支持 C++0x(无类型别名)的 GCC 4.4.6。
我认为现在使用 GCC 4.4.6 是一个非常糟糕的主意,但是,我想知道是否有一些方法可以模拟type alias。
以下代码可能有效,但arr不准确std::array<T, 32>,所以我想要一个更好的解决方案。
template<typename T>
struct arr : public std::array<T, 32>;
Run Code Online (Sandbox Code Playgroud) C++03 标准是否允许将 a 附加std::vector到自身?v我想知道如果需要重新分配内存,源迭代器是否会变得无效。在我的 STL 实现中,旧内存会一直保留,直到创建新内存为止。但我可以依靠这个吗?如果不是,v.reserve(2 * v.size())在插入之前是否是完全避免重新分配的良好解决方案?
vector<int> v;
v.reserve(3);
v.push_back(1);
v.push_back(2);
v.push_back(3);
// v may need to reallocate because its capacity may be less than 6.
// Is this operation safe?
v.insert(v.end(), v.cbegin(), v.cend());
Run Code Online (Sandbox Code Playgroud)
或者
// Here v will _not_ need to reallocate because it has enough capacity.
// Is this operation safe?
v.reserve(2 * v.size());
v.insert(v.end(), v.cbegin(), v.cend());
Run Code Online (Sandbox Code Playgroud) 您能否以简单,优雅和智能的方式介绍如何在没有特殊库的情况下在C++ 03中实现基本的lambda表达式?他们应该可以做这样的事情:
for_each(some_vector.begin(), some_vector.end(), _first = -5)
sort(some_vector.begin(), some_vector.end(), _first > _last)
Run Code Online (Sandbox Code Playgroud)
我在StackOverflow和互联网的其他地方看过很多主题,但不幸的是,我没有找到有用的东西.另一个想法是仔细研究Boost实现,但遗憾的是,我的水平现在还不太合适.
先感谢您!
将整数数组初始化为给定值的最快方法是什么?
如果我有char数组,我可以使用memset:
char a[N];
memset( a, value, N );
Run Code Online (Sandbox Code Playgroud)
如果数组类型!= char和value!= 0或-1,我不能做memset:
int a[N];
memset( a, value, N*sizeof(int) ); // INCORRECT!
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有办法对其他数组类型进行类似的内存初始化.
我希望了解C++类型以及更多细节(特定于C++ 03)的扩展和缩小转换.我知道你不能在一个问题线程上提出多个问题但是所有这些问题都与同一个主题相关.现在我有C++类型和范围msdn
现在考虑以下示例:
int a = 35000;
short b;
b=a;
Run Code Online (Sandbox Code Playgroud)
现在在上面的例子中,我知道a是4个字节,b是2个字节.我知道扩展转换会提高精度,因为缩小转换会降低精度.上面的例子我认为是一个缩小的演员(因为有数据丢失)4个字节进入两个字节.但是,在某些情况下,我感到困惑的是,正在进行的转换正在扩大还是正在缩小?我们是否考虑查看类型的字节数以确定它是扩大转换还是缩小转换,还是我们假设要查看范围?我还读到,为了缩小转换,需要显式转换,但在这种情况下,编译器没有指出任何错误,并隐含地进行了错误的转换.有关为何发生的任何建议?我正在使用VS2010
我的代码必须在几个平台(Linux,Mac,Windows)和架构(32/64位)上运行,并有几个编译器(GCC,MSVC,Intel).在瓶颈代码中,我已经分配std::vector<double> x了大小> 0.用给定的常量值填充它的最佳方法是什么c?
我的第一种方法是循环:
for(std::size_t i = 0; i < x.size(); ++i)
x[i] = c;
Run Code Online (Sandbox Code Playgroud)
循环也可以用迭代器完成:
for(std::vector<double>::iterator it = x.begin(); it != x.end(); ++it)
*it = c;
Run Code Online (Sandbox Code Playgroud)
我也可以使用类提供的赋值函数,std::vector并且如果大小相同,我可以确信没有重新分配(我希望):
x.assign(x.size(), c);
Run Code Online (Sandbox Code Playgroud)
有没有一种标准的方法来非常有效地做到这一点?(我无法测试所有可能的配置,我需要标准或良好的体验感受响应).
注1:我不想使用asm的解决方案
注2:出于兼容性原因,我不使用C++ 11
我发现在我们公司的代码中使用了以下模式.
struct Foo
{
enum FType
{
TypeA,
TypeB,
Type_MAX
};
};
typedef Foo::FType FooType;
[...]
FooType m_type;
Run Code Online (Sandbox Code Playgroud)
我的问题是,这有什么好处?(或者,这避免了什么问题?)要明确,我想知道他们为什么不只是......
enum FooType
{
TypeA,
TypeB,
Type_MAX
};
[...]
FooType m_type;
Run Code Online (Sandbox Code Playgroud)
我不能问原来的程序员,因为他们已被重新分配,事实证明我们公司的指定主题专家实际上是我.
如果它有帮助,这个代码已经在不同的时间使用许多版本的MSVC,gcc和clang编译为不同的目标平台...所有预先C++ 11.
谁能明白为什么这样做了?如果答案结果是微不足道的话,请提前道歉.
编辑添加:这是在类内部使用.(当枚举是全局的时,我们的样式指南要求条目以公共前缀开头,以便将它们与其他符号区分开.)