指向有关初始化的类类型的指针
pointer to a class type about initialization
#include <iostream>
using namespace std;
class B{
public:
int date;
B(){cout<<"B()"<<endl;}
B(int a){date=a;cout<<"B(int a)"<<endl;}
B(const B& b){
date=b.date;
cout<<"int date;"<<endl;
}
B& operator =(const B& b){
date=b.date;
cout<<"operator(const B& b)"<<endl;
return *this;
}
void print(){
std::cout<<date<<std::endl;
}
};
int main(){
B a(1);//use B(int a)
B* b;
B* c;
*b=a;//use operator(const B& b)
*c=*b;//but this one is wrong,why?,I think it also use operator(const B& b)
new (c)B(*b);
return 0;
}
当我使用*c=*b
它不起作用时,我认为它也使用operator(const B& b)
,但是当我使用new(c)B(*b)
时,它没关系。
*c=*b
和new(c)B(*b)
有什么区别,为什么*c=*b
错了?
您的代码:
B* b;
B* c;
现在b
和c
是单元化的,这意味着不知道它们指向的内存地址。
当您执行以下操作时:
*b = a;
它将该未知地址的值更改为 a 的值。 这会导致undefined behavior
.
然后你做:
*c = *b;
它基本上将未知地址的值设置为 c
未知地址的值b
此时"可能"仍然是 a
的值,但它是未知的。
原因
new (c)B(*b);
正在起作用,是undefined behavior
的黑暗魔法。
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?