如果我有一个班级,例如:
class Info
{
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
我曾经创建过一个对象,
Info *p = new Info();
Run Code Online (Sandbox Code Playgroud)
Info旁边的括号是否意味着我正在初始化它?它与此Info *p = new Info;有何不同?
我知道有一个问题可以区分新旧C++语言中的不同含义,但我想知道默认值和值初始化之间的语义差异,例如,值初始化是否意味着将某些内容初始化为零?
C++11§12.1/ 14:
在构造const对象期间,如果通过未从构造函数的this指针直接或间接获得的左值访问对象或其任何子对象的值,则无法指定由此获得的对象或子对象的值.[例:
struct C;
void no_opt(C*);
struct C {
int c;
C() : c(0) { no_opt(this); }
};
const C cobj;
void no_opt(C* cptr) {
// value of cobj.c is unspecified
int i = cobj.c * 100;
cptr->c = 1;
// value of cobj.c is unspecified
cout << cobj.c * 100 << '\n';
}
Run Code Online (Sandbox Code Playgroud)
编译上面的示例输出100.我的问题是,为什么cobj.c在初始化列表0在进入构造函数之前将其设置为未指定的值?如果使用非const对象,这种行为有何不同?
我常常听到身边的人喜欢讨论汇编语言的写作,这也是我也想学习写作的原因之一.目前我正在学习装配和C.
所以,我的问题是你什么时候需要在实际代码中编写汇编?
学习真好吗?
在C中编写代码时是否有任何实际用途?
任何有用的评论或答案将不胜感激!
我想我知道可以接受,但我不确定我是否非常清楚地了解能见度
例如:
class X
{
int x;
};
Run Code Online (Sandbox Code Playgroud)
这里,'x'只在课堂上可见,但在课堂外可以访问.如果我是正确的,有人可以在答案中解释关于如何不控制能见度等的文本.
(C++ 03/11.0)应该注意,它是对受控制的成员和基类的访问,而不是它们的可见性.成员的名称仍然可见,并且当这些成员和基类不可访问时,仍会考虑对基类的隐式转换.建立对给定构造的解释而不考虑访问控制.如果建立的解释使用了不可访问的成员名称或基类,则该构造是不正确的.
在g ++中启用严格别名警告的正确方法是什么?VC++ 10是否实现了这些规则?
我正在尝试使用gcc编译以下内容 -pedantic-errors -pedantic -Wall -O2
#include <iostream>
void reset_uint32(uint32_t* pi)
{
char* c = (char*)(pi);
uint16_t* j = (uint16_t*)(c); // warning?
j[0] = 0;
j[1] = 0;
}
void foo()
{
uint32_t i = 1234;
reset_uint32(&i);
}
int main() {
foo();
}
Run Code Online (Sandbox Code Playgroud)
但我没有看到任何严格的别名警告.我也尝试过启用
-fstrict-aliasing
-Wstrict-aliasing
Run Code Online (Sandbox Code Playgroud)
但仍然没有警告.这是一个错误吗?
如果我在内联函数中它是否会改变其与内部链接的联系?例如:我在两个文件中使用或调用内联函数:
file1.cpp
//function definition
inline void foo() {}
Run Code Online (Sandbox Code Playgroud)
file2.cpp
//function definition
inline void foo() {}
Run Code Online (Sandbox Code Playgroud)
为什么我需要在每个文件中定义内联函数才能调用它?我正在建立一个内部联系?如果我使用static inline怎么办?
根据严格的别名规则:
struct B { virtual ~B() {} };
struct D : public B { };
D d;
char *c = reinterpret_cast<char*>(&d);
Run Code Online (Sandbox Code Playgroud)
A char*对任何不同类型的对象都是有效的.但现在的问题是,它是否会指向&d的相同地址?C++标准保证返回相同地址的保证是什么?
12.1/1.构造函数没有名称.使用可选的函数说明符序列(7.1.2)后跟构造函数的类名后跟参数列表的特殊声明符语法用于声明或定义构造函数.在这样的声明中,忽略构造函数类名称周围的可选括号.
阅读该文本,我想知道在下面的例子中,构造函数名称的括号是什么被忽略了?
class MyClass
{
MyClass();
};
MyClass::MyClass() {
}
Run Code Online (Sandbox Code Playgroud) 在其他帖子中,我遇到了
(5.2.9/8)类型"指向类型为cv1 T的D成员的指针"的右值可以转换为类型为"指向cv2 T类型的B成员的指针"的右值,其中B是基类(子句) D)的10)
请注意语言标准.所以我的问题,
int i = 0;
int *p = &i;
*p = 1;
Run Code Online (Sandbox Code Playgroud)
在所有情况下指针都是左值?什么时候被视为右值?
c++ ×9
constructor ×2
gcc ×2
pointers ×2
assembly ×1
const ×1
function ×1
inline ×1
linkage ×1
scope ×1
visibility ×1
visual-c++ ×1
x86 ×1