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
看楼下
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
bs只是区分了初始化和赋值
按照他的概念
初始化是在内存的一个位置上创建有效对象
而 赋值是把对象放入存储位置
随后的举例应该是想说可以在不满足前者的情况下使用后者,而这将引发未定义
考虑更明显的一个例子:
struct A{
std::string s;
};
A* a=(A*)malloc(sizeof(A));
a->s="hello";//undefined
2023年12月10日 08点12分 4
@g495326 是因为没有调用A类型的构造函数 这一步包含: (1)初始化成员 :调用string的构造函数 (2)执行A本身的构造函数体(因为是默认构造函数在这里是空的) 你学到类相关的东西就会知道
2023年12月10日 14点12分
此处的a已经被初始化了,至于分配的堆内存,malloc也不提供初始化功能呀
2023年12月10日 09点12分
@g495326 因为分配内存≠初始化并且分配内存≠创建对象 更严谨的说因为std::string不是POD导致A并不是一个隐式生存期类(即malloc不能隐式创建这样的对象),需要调用构造函数或者placement new创建对象 但是对于已经分配的内存来说它是可以read and write的 这就是bs所谓的undefined
2023年12月10日 09点12分
@g495326 初始化的只是一个指针而已 对象并没有创建并初始化 a->s="hello"就是所谓的对uninitialized var进行write or read
2023年12月10日 09点12分
level 1
本来就应该在声明的时候赋值,比如说给个0什么的。但是实际用起来,在日常代码中基本上不会有错,倒也没人在意
2023年12月10日 14点12分 5
@子幽BYB 确实,之前动态开辟数组的时候大小必须初始化(赋值后开的数组)不然就会报错访问越界,然后把大小开大一点就不会报错了,但是无法运行[呵呵]
2023年12月10日 16点12分
C++推荐的方式是在需要时创建,而不是预先创建,还给一个不用的值。
2023年12月11日 00点12分
@洪水证人 我说的就是需要时创建,比如你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
我也不想研究呀。比如我一直认为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
不懂不懂 只见过网友老发那个问题 所以我目前的一个认知是编译器在完成一个过程比如;分割只允许一次=赋值
2023年12月11日 06点12分 14
level 1
1,默认初始化也是初始化 ,自动变量的默认初始化只是初始化成不确定的值不是说不初始化 2,malloc的例子更有说服力3,缺陷已经打补丁,已经有隐式生存期对象了。
2023年12月13日 07点12分 15
1