在VC++中,当我需要指定一个绑定类成员变量的数组时,我这样做:
class Class {
private:
static const int numberOfColors = 16;
COLORREF colors[numberOfColors];
};
Run Code Online (Sandbox Code Playgroud)
(请不要告诉我在这里使用std :: vector)
这样我就有了一个常量,可以用作数组绑定,稍后在类代码中指定循环语句约束,同时在其他任何地方都不可见.
问题是static const int成员变量的这种用法是仅由VC++允许还是其他广泛编译器通常允许的?
前几天我正在编写带有异常处理的代码,我有一些关于异常,它们的保证和抛出的问题.
基本上,说你有:
class X {
string m_str;
X() : m_str("foo")//what if this throws?
{
ifstream b("a.in")//what if this throws?
}
Run Code Online (Sandbox Code Playgroud)
在浏览了我能找到的所有文章之后,我仍然不知道处理这个问题的干净方法是什么.
说我有一个像这样的代码:
{
...
X myInstanceOfClassX;
...
}
Run Code Online (Sandbox Code Playgroud)
我应该把代码包装catch(exception &)好吗?如果我这样做,确实string并ifstream保证有一个强有力的保证,没有资源泄露,没有任何东西被打开一半?
此外,如果我的类抛出myexception,这是从异常派生的,catch(exception &)似乎让它通过.那么让我看到catch(...)哪个IIRC可以访问违规行为?还有另外一种方法吗?
然后在某处有一条信息,不应该捕获在对象构造函数的子构造函数中抛出的任何异常,并且构造函数应该抛出以防任何成员对象抛出.
如果上面的代码不是从构造函数调用,而是从常规函数调用void foo(),我应该捕获哪些异常呢?outofmemory_something,filenotfound_something?我在哪里可以找到STL对象可以抛出的定义?它们的实施是否具体?
权威来源在哪里可以清除我对此主题的所有怀疑和疑问?
到目前为止,处理异常似乎就像在一大堆gooo中跳舞一样.错误代码似乎更简单,更安全......
double d = 1/2.;
printf("%.2lf\n", d);
Run Code Online (Sandbox Code Playgroud)
打印出来0.50.这就是我想用ostream操纵器复制的内容.但是,没有一个明显的iomanip操纵器允许我设置所需的最小小数位(如果我理解正确,则setprecision设置最大宽度).有没有纯粹iostream或boost方法这样做?
可能重复:
std :: string及其自动调整内存大小
我只是很好奇,字符串是如何存储在内存中的?例如,当我这样做时:
string testString = "asd";
Run Code Online (Sandbox Code Playgroud)
它分配4个字节,对吧?a + s + d + \0.
但是后来,当我想为这个字符串分配一些新文本时,它可以工作,但我不明白如何.例如,我这样做:
testString = "123456789"
Run Code Online (Sandbox Code Playgroud)
现在它应该是10个字节长.但是如果没有这种字符串的空间呢?假设字符串开头的第五个+第六个字节被其他一些字符占用.CPU如何处理它?它在内存中找到了全新的位置,该字符串适合?
以下是Effective Modern C++(第55页)的引用:
"假设你使用一组空的大括号来构造一个支持默认构造函数的对象,并且还支持std :: initializer_list构造.你的空括号是什么意思?等规则是你得到默认构造."
我用std :: array尝试过这个:
std::array<int, 10> arr{};
Run Code Online (Sandbox Code Playgroud)
并得到了g ++(版本4.8.2)的警告:
警告:缺少成员'std :: array <int,10ul> :: _ M_elems'的初始值设定项
这是在尝试std::array从空构造一个时得到的警告std::initializer_list(请参阅为什么我可以从{}初始化一个常规数组,而不是std :: array来讨论此警告).
那么,为什么上面的代码行不能解释为调用默认构造函数?
我有以下成员函数:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
return m_person;
}
Run Code Online (Sandbox Code Playgroud)
RAIIMutex 是一个辅助类,它接收互斥锁并将其锁定在构造函数中并在析构函数中释放.
m_person是类型Person(尺寸非常小).其他线程中的其他函数可能会更改此成员.
我希望m_person按值返回(返回副本),当然我想避免m_person在返回时复制另一个线程时被更改的情况,所以我添加了锁.
但首先会发生什么?编译器是先创建一个m_person或者先调用析构函数的副本myLock吗?
从理论上讲,它可以通过这样的方式轻松解决:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
Person tmp = m_person;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
但我很想知道我的问题的答案.
谢谢
我想知道是否有人知道 C++ string::erase 函数的实现及其复杂性。我知道 C++ 字符串是一个字符对象。我假设它不会分配和创建一个新的字符对象,然后从旧字符串 O(n) 和 O(n) 空间复制字符。它是否在字符 O(n) 和 O(1) 空间上移动?我查看了 cplusplus.com 和 Bjarne Stroustrup 的书,但没有找到答案。有人可以指出我实现它的源代码或知道答案吗?
谢谢!
与standard当前 C++ 中的所有内容不同,是否有任何特定原因要离开int, char, ....main()和其他人。(不是说+, -, %,.. 因为它们不是特定于语言的)
为什么不像:
std::int std::main(std::int argc, std::char *argv[])
{
//Sample C++ code (incorrect with current standards though)
std::return 0;
}
Run Code Online (Sandbox Code Playgroud)
超出标准范围的标准化不是不完整的吗?
我相信,它们是编写程序时随处可见的基本组件,无论是简单的还是复杂的。它们不包含在标准化中,只是为了遵循DRY原则。
在回答对我的另一种答案评论在这里,我找到了我想可能是在C标准(孔C1X,我没有检查的早期的,是的,我知道这是令人难以置信的可能性不大,我独自所有中行星的居民在标准中发现了一个错误).信息如下:
"The sizeof operator yields the size (in bytes) of its operand"."When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1".void *malloc(size_t sz)但所有内容都是"The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate".它根本没有提到用于论证的单位.CHAR_BIT因此字符长度可以超过一个字节.我的问题很简单:
在char为16位宽的环境中,将malloc(10 * sizeof(char))分配10个字符(20个字节)或10个字节?上面的第1点似乎表示前者,第2点表示后者.
任何比我更有C-standard-fu的人都有这个答案?
GCC 4.4.1拒绝在ctor-initializer中找到我的注入类名:
template <typename T>
struct Base
{
Base(int x) {}
};
struct Derived : Base<int>
{
Derived() : Base(2) {}
};
int main()
{
Derived d;
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)test2.cpp: In constructor "Derived::Derived()": test2.cpp:9: error: class "Derived" does not have any field named "Base" test2.cpp:9: error: no matching function for call to "Base<int>::Base()" test2.cpp:4: note: candidates are: Base<T>::Base(int) [with T = int] test2.cpp:3: note: Base<int>::Base(const Base<int>&)
不过,GCC 4.8 编译得很好.
我确信这应该有效,我找不到任何不同意我的标准措辞.
这是一个GCC 4.4.1错误,对吗?
(我确实冲过GCC Bugzilla,但没有任何相关内容突然出现在我面前.)