相关疑难解决方法(0)

最终C++书籍指南和列表

这个问题试图收集每年出版的数十本不良C++书籍中的少数珍珠.

与许多其他编程语言不同,这些编程语言经常从互联网上的教程中随处获取,很少有人能够快速学习C++,而无需学习编写精良的C++书籍.这样做太复杂了.事实上,它是如此庞大和复杂,有很多非常糟糕的C++书籍.我们并不是在谈论糟糕的风格,而是体育明显的事实错误促进糟糕的编程风格.

请编辑接受的答案,以提供高质量的书籍和近似的技能水平 - 最好 C++聊天室讨论您的添加.(如果他们不同意建议,常客可能会毫不留情地撤销你的工作.)添加一篇关于你亲自阅读/受益的每本书的简短描述/描述.随意讨论质量,标题等.符合标准的书籍将被添加到列表中.由C和C++用户协会(ACCU)撰写评论的图书都有指向评论的链接.

*注意:常见问题和其他资源可以在C++标签信息.

c++ c++-faq

4246
推荐指数
1
解决办法
224万
查看次数

如何在C++中使用数组?

C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.

本FAQ分为五个部分:

  1. 类型级别的数组和访问元素
  2. 数组创建和初始化
  3. 赋值和参数传递
  4. 多维数组和指针数组
  5. 使用数组时常见的陷阱

如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.

在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用newdelete如下所示是非常危险的,但这是另一个常见问题解答的主题.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ arrays pointers c++-faq multidimensional-array

469
推荐指数
5
解决办法
12万
查看次数

C++构造函数名后的冒号是做什么的?

冒号运算符(":")在这个构造函数中做了什么?它等同于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++ constructor initialization-list ctor-initializer

85
推荐指数
2
解决办法
5万
查看次数

初始化构造函数中的字段 - 初始化列表与构造函数体

我一直在用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++ parameters

48
推荐指数
4
解决办法
5万
查看次数

构造函数中冒号后的变量

我还在学习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++ constructor ctor-initializer

22
推荐指数
2
解决办法
8173
查看次数

构造函数中冒号之后的成员变量列表是什么?

我正在阅读这个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"之类的东西?

更新: 谢谢你的答案.那些被称为方法?(我猜不是)在构造函数体内调用它们有什么不同

c++ constructor

11
推荐指数
3
解决办法
6230
查看次数

什么:::在C++中意味着什么?

可能重复:
构造函数中这个奇怪的冒号成员语法是什么?

我以为我知道一切,但总会出现一些东西.也许我忘了什么.什么: ::name意思?我怀疑::google从全局命名空间的使用方法google,protobuf,message.但:它之前做了什么呢?左边没有文字,所以它不能成为标签(或者可以吗?!).那是什么?

Namespace::Namespace()
  : ::google::protobuf::Message() {
  SharedCtor();
}
Run Code Online (Sandbox Code Playgroud)

-edit-我觉得很傻,这种压力让我感到高兴.我以为我正在寻找功能体内部.我当时希望这会是新事物.

c++ syntax

10
推荐指数
3
解决办法
3万
查看次数

立即定义带有值的字符串时建议的速度提升,而不是延迟

我目前正在阅读Bjarne Stroustrup撰写的"The C++ Programming Language:Special Edition"和第133页,其中说明如下:

对于用户定义的类型,将变量的定义推迟到合适的初始化程序可用之后,也可以获得更好的性能.例如:

string s;  /* .... */ s = "The best is the enemy of the good.";
Run Code Online (Sandbox Code Playgroud)

很容易慢得多

string s = "Voltaire";
Run Code Online (Sandbox Code Playgroud)

我知道状态很容易,这意味着它不一定是这样,但是我们只是说它确实发生了.

为什么这会带来潜在的性能提升?

难道只有这样与用户定义类型(甚至STL型)或者是这也与案件int,float等等?

c++ performance definitions

10
推荐指数
2
解决办法
217
查看次数

通过构造函数传递和存储const引用?

这可能是一个简单的问题,但我坚持下去.我试图通过它的构造函数将一个对象从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引用传递不是很熟悉.

c++ pointers reference constants

10
推荐指数
1
解决办法
2万
查看次数

自定义类/对象的构造函数和初始化

我可以想象这个问题已经被问到了,但实际上我找不到任何合适的解决方案,所以请原谅这是一个多余的问题.

我有一个自定义类

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++ constructor initialization

9
推荐指数
1
解决办法
1万
查看次数