这个问题试图收集每年出版的数十本不良C++书籍中的少数珍珠.
与许多其他编程语言不同,这些编程语言经常从互联网上的教程中随处获取,很少有人能够快速学习C++,而无需学习编写精良的C++书籍.这样做太复杂了.事实上,它是如此庞大和复杂,有很多非常糟糕的C++书籍.我们并不是在谈论糟糕的风格,而是体育明显的事实错误和促进糟糕的编程风格.
请编辑接受的答案,以提供高质量的书籍和近似的技能水平 - 最好 在 C++聊天室讨论您的添加后.(如果他们不同意建议,常客可能会毫不留情地撤销你的工作.)添加一篇关于你亲自阅读/受益的每本书的简短描述/描述.随意讨论质量,标题等.符合标准的书籍将被添加到列表中.由C和C++用户协会(ACCU)撰写评论的图书都有指向评论的链接.
*注意:常见问题和其他资源可以在C++标签信息和c ++ - faq中找到.
C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.
本FAQ分为五个部分:
如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.
在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用new和delete如下所示是非常危险的,但这是另一个常见问题解答的主题.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
冒号运算符(":")在这个构造函数中做了什么?它等同于MyClass(m_classID = -1, m_userdata = 0);?
class MyClass {
public:
MyClass() : m_classID(-1), m_userdata(0) {
}
int m_classID;
void *m_userdata;
};
Run Code Online (Sandbox Code Playgroud) 我一直在用c ++工作一段时间,但我不确定它们之间的区别
public : Thing(int _foo, int _bar): member1(_foo), member2(_bar){}
Run Code Online (Sandbox Code Playgroud)
和
public : Thing(int _foo, int _bar){
member1 = _foo;
member2 = _bar;
}
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,他们做同样的事情,但这两种语法之间是否存在实际差异.其中一个比另一个更安全,它们是否以不同方式处理默认参数.
不完全习惯于第一个例子,所以如果我犯了错误,我道歉.
我还在学习C++并试图理解它.我正在查看一些代码并看到:
point3(float X, float Y, float Z) :
x(X), y(Y), z(Z) // <----- what is this used for
{
}
Run Code Online (Sandbox Code Playgroud)
位于构造函数参数旁边的"x(X),y(Y),z(Z)"是什么意思?
我正在阅读这个C++开源代码,我来到了一个构造函数,但我没有得到它(主要是因为我不知道C++:P)
我非常了解C和Java.
TransparentObject::TransparentObject( int w, int x, int y, int z ) :
_someMethod( 0 ),
_someOtherMethod( 0 ),
_someOtherOtherMethod( 0 ),
_someMethodX( 0 )
{
int bla;
int bla;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我可以"演绎"第一行只声明了construtor名称,"::"听起来像"属于"我.而{}之间的代码是它自己的构造函数体.
我"认为"在参数之后是什么,第一个"{"就像方法默认参数或其他什么,但我在网上找不到合理的解释.我在示例中找到的大多数C++构造函数几乎与Java中的相同.
在我的假设中,我是对的吗?"::"就像属于,而params和body之后的列表就像"默认args"之类的东西?
更新: 谢谢你的答案.那些被称为方法?(我猜不是)在构造函数体内调用它们有什么不同
可能重复:
构造函数中这个奇怪的冒号成员语法是什么?
我以为我知道一切,但总会出现一些东西.也许我忘了什么.什么: ::name意思?我怀疑::google从全局命名空间的使用方法google,protobuf,message.但:它之前做了什么呢?左边没有文字,所以它不能成为标签(或者可以吗?!).那是什么?
Namespace::Namespace()
: ::google::protobuf::Message() {
SharedCtor();
}
Run Code Online (Sandbox Code Playgroud)
-edit-我觉得很傻,这种压力让我感到高兴.我以为我正在寻找功能体内部.我当时希望这会是新事物.
我目前正在阅读Bjarne Stroustrup撰写的"The C++ Programming Language:Special Edition"和第133页,其中说明如下:
对于用户定义的类型,将变量的定义推迟到合适的初始化程序可用之后,也可以获得更好的性能.例如:
Run Code Online (Sandbox Code Playgroud)string s; /* .... */ s = "The best is the enemy of the good.";很容易慢得多
Run Code Online (Sandbox Code Playgroud)string s = "Voltaire";
我知道状态很容易,这意味着它不一定是这样,但是我们只是说它确实发生了.
为什么这会带来潜在的性能提升?
难道只有这样与用户定义类型(甚至STL型)或者是这也与案件int,float等等?
这可能是一个简单的问题,但我坚持下去.我试图通过它的构造函数将一个对象从ObjectA传递给ObjectB(它是ObjectA的一个成员).但是,我想传递一个const引用并无限期地存储该引用,而不是传递值.问题是我不知道该怎么做.
我可以用这样的指针来处理这个问题:
class ClassB
{
private:
int *ptrInternalX;
public:
ClassB( int *tempX );
}
ClassB::ClassB( int *tempX )
{
ptrInternalX = tempX
}
Run Code Online (Sandbox Code Playgroud)
这样,创建一个对象并将指针传递给int,该指针存储在类中以供以后使用.
但是,当使用更大的对象时,指针让我担心内存泄漏和其他问题,所以我想尝试使用'常量引用'(const&)来做这样的事情.但是,这似乎不起作用......
class ClassB
{
private:
int &internalX;
public:
ClassB( const int &tempX );
}
ClassB::ClassB( const int &tempX )
{
internalX = tempX
}
Run Code Online (Sandbox Code Playgroud)
我知道引用本质上是现有变量的"别名"(引用相同内存地址的不同名称),并且需要使用现有变量立即初始化它们.所以这会在我的程序中产生错误!
这甚至可能吗?或者是否有更好/更清晰的方式做这样的事情?我想使用常量引用的原因是只传递引用而不是大对象的速度,同时保持数据免受意外更改和内存泄漏......我确信有一种简单直接的方法这样做但我对const引用传递不是很熟悉.
我可以想象这个问题已经被问到了,但实际上我找不到任何合适的解决方案,所以请原谅这是一个多余的问题.
我有一个自定义类
class myClass_A
{
public:
myClass_A(); // Constructor
myFunction_A(); // Some function from Class A
};
Run Code Online (Sandbox Code Playgroud)
现在我有另一个自定义类,它有一个类型的成员 myClass_A
class myClass_B
{
public:
myFunction_B(); // Some function from Class B
private:
myClass_A m_instance; // Instance of Class A
}
Run Code Online (Sandbox Code Playgroud)
现在myFunction_B()想myFunction_A()从m_instance这样的方式调用方法:
myClass_B::myFunction_B()
{
m_instance.myFunction_A();
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我编译我的代码(基本上就像我上面发布的示例),它将成功,没有任何警告或错误.所以我的问题是:
A.在这个例子中是否会调用构造函数?
B.我真的可以从未初始化的对象中调用方法吗?
C.假设没有调用构造函数但我仍然可以从该对象调用方法 - >这意味着我的类的成员仍未初始化?
对不起,如果这些问题有点愚蠢,但我觉得我现在的速度很慢.
c++ ×10
constructor ×4
c++-faq ×2
pointers ×2
arrays ×1
constants ×1
definitions ×1
parameters ×1
performance ×1
reference ×1
syntax ×1