C++ 对象引用和对象指针

C++ 对象引用和对象指针,c++,visual-c++,C++,Visual C++,在复制构造函数的情况下,如果在参数中使用指针而不是引用变量,会发生什么?例如 class MyClass { private: int a; char *str; public:... ... MyClass(MyClass *pObj) { .... .... } }; 复制构造函数应该从对象而不是指针进行复制。 为什么按引用传递而不是按值传递?因为如果不这样做,复制构造函数将创

在复制构造函数的情况下,如果在参数中使用指针而不是引用变量,会发生什么?例如

class MyClass
{
private: int a;
         char *str;
public:...
       ...
       MyClass(MyClass *pObj)
       {
          ....
          ....
       }
};

复制构造函数应该从对象而不是指针进行复制。

为什么按引用传递而不是按值传递?因为如果不这样做,复制构造函数将创建参数的副本,这将是一个无止境的循环。

复制构造函数应该从对象而不是指针进行复制。

为什么按引用传递而不是按值传递?因为如果不这样做,复制构造函数将创建参数的副本,这将是一个无止境的循环。

根据定义,复制构造函数是具有同一类的常量引用参数的构造函数。 任何其他构造函数定义都不是“复制构造函数”,因此在编写以下内容时编译器不会调用它:

MyClass x = y;


根据定义,复制构造函数是具有同一类的常量引用参数的构造函数。 任何其他构造函数定义都不是“复制构造函数”,因此在编写以下内容时编译器不会调用它:

MyClass x = y;

MyClass(MyClass*pObj)

不是复制构造函数,而是重载构造函数

复制构造函数引用与参数相同的类型。例:

MyClass(MyClass&)

如果您不提供自己的版本,编译器会隐式地为类生成一个副本构造函数。 当编译器需要生成对象的副本时,将调用此复制构造函数

上面提到的重载构造函数只有在显式调用时才会被调用

#include<iostream>

class MyClass
{
    private: int a;
             char *str;
    public:   
           MyClass(){}        
           MyClass(MyClass *pObj)
           {
               std::cout<<"\ninside *";
           }
           MyClass(MyClass &pObj)
           {
              std::cout<<"\ninside &";
           }    
           void doSomething(MyClass obj)
           {
               std::cout<<"\ndoSomething";
           }
};

int main()
{
      MyClass ob,ob2;
      MyClass obj2(&ob);   //Explicitly invoke overloaded constructor

      ob.doSomething(ob2); //Calls copy constructor to create temp copy of object
      return 0;
}
MyClass(MyClass*pObj)

不是复制构造函数,而是重载构造函数

复制构造函数引用与参数相同的类型。例:

MyClass(MyClass&)

如果您不提供自己的版本,编译器会隐式地为类生成一个副本构造函数。 当编译器需要生成对象的副本时,将调用此复制构造函数

上面提到的重载构造函数只有在显式调用时才会被调用

#include<iostream>

class MyClass
{
    private: int a;
             char *str;
    public:   
           MyClass(){}        
           MyClass(MyClass *pObj)
           {
               std::cout<<"\ninside *";
           }
           MyClass(MyClass &pObj)
           {
              std::cout<<"\ninside &";
           }    
           void doSomething(MyClass obj)
           {
               std::cout<<"\ndoSomething";
           }
};

int main()
{
      MyClass ob,ob2;
      MyClass obj2(&ob);   //Explicitly invoke overloaded constructor

      ob.doSomething(ob2); //Calls copy constructor to create temp copy of object
      return 0;
}

通常的答案是如果。。。?问题是-编写一个示例程序并亲自查看..这不是传统意义上的复制构造函数-复制构造函数有一个特定的签名,
MyClass(const MyClass&)
…通常的答案是如果。。。?问题是-编写一个示例程序并亲自查看..这不是传统意义上的复制构造函数-复制构造函数有一个特定的签名,
MyClass(const MyClass&)
…谢谢。是的,但是会发生什么,因为我想要这样一个情况出错的案例。我尝试使用指针编写代码,并成功编译和执行了该代码。你能给我一个这样的条件会失败的例子吗?你调用像MyClass(MyClass*)这样的东西是一个复制构造函数的想法是无效的,因为我们已经知道它是一个参数化构造函数,所以程序将编译良好,运行良好,但不要说它是一个复制构造函数。此外,您是否尝试过:MyClass*pObj=NULL;MyClass Obj(pObj);它也运行吗?那绝对正确。它显示了分段错误。现在我得到了我问题的答案。谢谢abhinav@user993009许多程序员更喜欢选择引用,因为它们速度更快,不需要检查NULL,而且显然它们避免了SEGFAULT。现在我猜你是新来的,所以我应该告诉你,如果你感到满意,你可以选择左边的复选标记,然后投赞成票。这将提高你的声誉。你能解释一下你在
参考资料后面的推理/理解吗,因为它们更快
?因为那是不对的。谢谢。是的,但是会发生什么,因为我想要这样一个情况出错的案例。我尝试使用指针编写代码,并成功编译和执行了该代码。你能给我一个这样的条件会失败的例子吗?你调用像MyClass(MyClass*)这样的东西是一个复制构造函数的想法是无效的,因为我们已经知道它是一个参数化构造函数,所以程序将编译良好,运行良好,但不要说它是一个复制构造函数。此外,您是否尝试过:MyClass*pObj=NULL;MyClass Obj(pObj);它也运行吗?那绝对正确。它显示了分段错误。现在我得到了我问题的答案。谢谢abhinav@user993009许多程序员更喜欢选择引用,因为它们速度更快,不需要检查NULL,而且显然它们避免了SEGFAULT。现在我猜你是新来的,所以我应该告诉你,如果你感到满意,你可以选择左边的复选标记,然后投赞成票。这将提高你的声誉。你能解释一下你在
参考资料后面的推理/理解吗,因为它们更快
?因为那不正确。谢谢。我也试过这个。意味着它不是构造函数,因为我们明确地调用它。是否存在可能发生的空值问题,因为引用不包含空值。指针保持空值。我只想清除这个。它是一个重载构造函数。是的,指针可以为NULL,引用不能为NULL,如果引用为NULL,则程序的格式已经不正确。是的,如果重载构造函数采用指针参数,则需要对NULL进行处理。谢谢,我也尝试了这一点。意味着它不是构造函数,因为我们明确地调用它。是否存在可能发生的空值问题,因为引用不包含空值。指针保持空值。我只想清除这个。它是一个重载构造函数。是的,指针可以为NULL,引用不能为NULL,如果引用为NULL,则程序的格式已经不正确。是的,如果重载构造函数采用指针参数,则需要对NULL进行处理。