【问题标题】:pointer to a class type about initialization [duplicate]指向有关初始化的类类型的指针[重复]
【发布时间】:2015-11-26 09:39:50
【问题描述】:
#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&amp; b),但是当我使用new(c)B(*b)时它就可以了。

*c=*bnew(c)B(*b)有什么区别,为什么*c=*b错了?

【问题讨论】:

  • 它是如何不起作用的?您的指针此时尚未初始化,这可能会导致未定义的行为。
  • 所有使用指针bc的表达式会导致未定义的行为,因为bc是未初始化.

标签: c++


【解决方案1】:

您的代码:

B* b;
B* c;

现在bc 被统一化了,这意味着它们指向的内存地址是未知的。

当你这样做时:

*b = a;

它将未知地址的值更改为 a 的值。这导致undefined behavior

然后你做:

*c = *b;

这基本上将未知地址c的值设置为未知地址b的值,此时“可能”仍然是a的值,但它是未知的。

原因

new (c)B(*b);

正在工作,是undefined behavior 的黑魔法。

【讨论】:

  • “黑魔法”,因为这些力量很可能会打开你 :)
  • @StoryTeller 已更正帖子:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2016-11-09
相关资源
最近更新 更多