这个问题试图收集每年出版的数十本不良C++书籍中的少数珍珠.
与许多其他编程语言不同,这些编程语言经常从互联网上的教程中随处获取,很少有人能够快速学习C++,而无需学习编写精良的C++书籍.这样做太复杂了.事实上,它是如此庞大和复杂,有很多非常糟糕的C++书籍.我们并不是在谈论糟糕的风格,而是体育明显的事实错误和促进糟糕的编程风格.
请编辑接受的答案,以提供高质量的书籍和近似的技能水平 - 最好 在 C++聊天室讨论您的添加后.(如果他们不同意建议,常客可能会毫不留情地撤销你的工作.)添加一篇关于你亲自阅读/受益的每本书的简短描述/描述.随意讨论质量,标题等.符合标准的书籍将被添加到列表中.由C和C++用户协会(ACCU)撰写评论的图书都有指向评论的链接.
*注意:常见问题和其他资源可以在C++标签信息和c ++ - faq中找到.
对象如何在C++中存储在内存中?
对于常规课程,如
class Object
{
public:
int i1;
int i2;
char i3;
int i4;
private:
};
Run Code Online (Sandbox Code Playgroud)
使用Object作为数组的指针可以用来访问i1如下?
((Object*)&myObject)[0] === i1?
Run Code Online (Sandbox Code Playgroud)
关于SO的其他问题似乎暗示将结构转换为指针将指向POD类型的第一个成员.如果有构造函数的类,这有什么不同?另外,对于非POD类型,它有何不同?
编辑:
因此,在记忆中,上述课程的布局如下:
[i1 - 4bytes][i2 - 4bytes][i3 - 1byte][padding - 3bytes][i4 - 4bytes]
Run Code Online (Sandbox Code Playgroud) 谁能告诉我为什么对于 MSVC、clang 和 g++,nullptr分配给类型数据成员指针的内部表示是 -1?Class::*对于 64 位系统来说(size_t)1 << 63是最好的,因为如果您nullptr以这种方式使用成员指针,您肯定会接触内核内存并发生崩溃,因此这将是一个很好的调试辅助工具。
-1背后有更深层次的原因吗?
样本:
struct X
{
int x, y;
};
using member_ptr = int X::*;
member_ptr f()
{
return nullptr;
}
Run Code Online (Sandbox Code Playgroud)
...使用 g++ 生成以下二进制文件:
movq $-1, %rax
ret
Run Code Online (Sandbox Code Playgroud) 我正在尝试按偏移量访问和修改类的私有数据成员。
AFAIK,首先是计算偏移量,然后通过偏移量访问成员。
这是我的代码。
class Test {
public:
int a;
int b;
private:
int c;
};
Test test;
cout << *(&test + &Test::b + 1); // access c
Run Code Online (Sandbox Code Playgroud)
我收到错误:“+”运算符无效,正确的操作数包含“ int Test::*”类型。
有一个类似的帖子,它是asprintf的偏移量,但是当尝试这样时: ab1,4
cout << &Test::a << '\t' << &Test::b;
Run Code Online (Sandbox Code Playgroud)
我有1 1。
我的问题:
1.为什么cout得到错误的结果?2.指向
什么?
3. 如何访问和修改Test::*指针?(或者在不知道偏移量的情况下如何访问私有成员?)Test::*p