C加加和C语言差别还是挺大的嘛
c语言吧
全部回复
仅看楼主
level 11
g495326
楼主
int i;i=1;在C加加中是未定义行为
2023年12月10日 05点12分
1
level 12
一周休七日
不会啊
2023年12月10日 06点12分
2
g495326
看楼下
2023年12月10日 06点12分
level 11
g495326
楼主
来源:a tour of c++
2023年12月10日 06点12分
3
天才可拉
这里不是说for almost all么,又没有说all
2023年12月10日 15点12分
吧务
level 11
Asuka的猪
bs只是区分了初始化和赋值
按照他的概念
初始化是在内存的一个位置上创建有效对象
而 赋值是把对象放入存储位置
随后的举例应该是想说可以在不满足前者的情况下使用后者,而这将引发未定义
考虑更明显的一个例子:
struct A{
std::string s;
};
A* a=(A*)malloc(sizeof(A));
a->s="hello";//undefined
2023年12月10日 08点12分
4
Asuka的猪
@g495326
是因为没有调用A类型的构造函数 这一步包含: (1)初始化成员 :调用string的构造函数 (2)执行A本身的构造函数体(因为是默认构造函数在这里是空的) 你学到类相关的东西就会知道
2023年12月10日 14点12分
g495326
此处的a已经被初始化了,至于分配的堆内存,malloc也不提供初始化功能呀
2023年12月10日 09点12分
Asuka的猪
@g495326
因为分配内存≠初始化并且分配内存≠创建对象 更严谨的说因为std::string不是POD导致A并不是一个隐式生存期类(即malloc不能隐式创建这样的对象),需要调用构造函数或者placement new创建对象 但是对于已经分配的内存来说它是可以read and write的 这就是bs所谓的undefined
2023年12月10日 09点12分
Asuka的猪
@g495326
初始化的只是一个指针而已 对象并没有创建并初始化 a->s="hello"就是所谓的对uninitialized var进行write or read
2023年12月10日 09点12分
level 1
scott_0501
本来就应该在声明的时候赋值,比如说给个0什么的。但是实际用起来,在日常代码中基本上不会有错,倒也没人在意
2023年12月10日 14点12分
5
篝🔥追逐者
@子幽BYB
确实,之前动态开辟数组的时候大小必须初始化(赋值后开的数组)不然就会报错访问越界,然后把大小开大一点就不会报错了,但是无法运行
2023年12月10日 16点12分
洪水证人
C++推荐的方式是在需要时创建,而不是预先创建,还给一个不用的值。
2023年12月11日 00点12分
scott_0501
@洪水证人
我说的就是需要时创建,比如你for循环里int i=0;i<10;i+=1这样,谁没事一上来就int a b c d e f g这样的啊
2023年12月11日 03点12分
level 1
天才可拉
如果你已经通过malloc拿到相应大小内存了,但没有调用构造函数,可以placement new用原地构造。
2023年12月10日 15点12分
6
level 1
沐棥
研究那么细干嘛,又用不到
2023年12月10日 15点12分
7
g495326
我也不想研究呀。比如我一直认为1+1=2,某天有个人跳出来说1+1=3。那你说是等于二,还是等于三呢?
2023年12月11日 02点12分
level 1
史怜梦
c++引入了类和对象概念,在面向对象思想下,所有的对象都需要通过构造函数生成(被定义为对象的初始化行为),构造函数可以包含内存分配或者赋值等一些列行为,单纯分配内存或者赋值等行为并不符合面向对象的封装思想
2023年12月10日 15点12分
8
史怜梦
究其本质还是抽象思想在实现的过程中提供了更严格的规范
2023年12月10日 15点12分
史怜梦
@不一样的惩
理论上是为了兼容c才不需要的
2023年12月11日 04点12分
温莉-洛克白
跟面向对象没关系,这叫raii
2023年12月13日 07点12分
level 7
妳曾是我的誰
我选c#
2023年12月10日 23点12分
10
level 1
为酱而油
没太看懂,后面那句话的意思是引用还能有未初始化的情况?
2023年12月11日 03点12分
11
level 3
若晨曦散尽
int i不是会默认初始化?
2023年12月11日 05点12分
13
level 1
起个id真难119
不懂不懂 只见过网友老发那个问题 所以我目前的一个认知是编译器在完成一个过程比如;分割只允许一次=赋值
2023年12月11日 06点12分
14
level 1
温莉-洛克白
1,默认初始化也是初始化 ,自动变量的默认初始化只是初始化成不确定的值不是说不初始化 2,malloc的例子更有说服力3,缺陷已经打补丁,已经有隐式生存期对象了。
2023年12月13日 07点12分
15
1