拷贝构造函数和拷贝赋值运算符的调用问题

问题描述

拷贝构造函数和拷贝赋值运算符的调用问题
假设有如下类:
class HasPtr{
public:
HasPtr(const string &s):
ps(new string(s))i(0){}
HasPtr(const HasPtr &hp){

ps=new string(*hp.ps);
i=hp.i;
}
HasPtr(const char *s):ps(new string(s))i(0){}
HasPtr & operator=(const HasPtr &);
private:
string *ps;
int i;

};
情况一 :HasPtr h1(""hehe"")h2; h2=h1; 问:编译器会优先调用拷贝构造函数和拷贝赋值运算符?
情况二:假如没有定义拷贝构造函数,执行与上述相同的代码。问:编译器会优先调用自定义的拷贝赋值运算符,还是编译器合成的拷贝构造函数?
新手求大神指教。

解决方案

h1是构造,h2是赋值
只有HasPtr h2(h1)
才是拷贝构造

解决方案二:
有自定义的肯定是使用自定义的。不然还要自定义的干嘛。

解决方案三:
C++拷贝构造函数(深拷贝,浅拷贝)

解决方案四:
上述代码调试的时候h2并没有按照预想的情形编译器会调用赋值运算符的重载函数

解决方案五:
http://www.cnblogs.com/BlueTzar/articles/1223313.html

时间: 2024-11-02 11:15:02

拷贝构造函数和拷贝赋值运算符的调用问题的相关文章

详解C++ 拷贝构造函数和赋值运算符_C 语言

本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符.但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算. class Person { public: Person(const Person& p) = dele

C++中拷贝构造函数的总结详解_C 语言

1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了.(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数.百度百科上是这样说的:拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化.其唯一的参数(对象的引用)是不可变的(const类型).此函数经常用在函数调用时用户定义类型的值传递及返回. 2.拷贝构造函数的形式 复制代码 代码如下: Class X{public: X(); X(const

C++类对象的拷贝构造函数分析

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CA{ public: CA(int b) { a=b; } void Show () { cout<<a<<endl; } private: int a;};int main(){

浅析拷贝构造函数

这篇文章,主要是受Jinhao (辣子鸡丁·GAME就这样OVER了 )在CSDN上一篇题为<有关拷贝构造函数的说法不正确的是>的帖子启发,鸡丁就这四个问题回答如下.    拷贝构造函数的名字和类名是一样的 [错]    类中只有一个拷贝构造函数 [错]    拷贝构造函数可以有多个参数 [对]          拷贝构造函数无任何函数类型 [错] 在这里我不想讨论以上问题的正确与错误,只是讨论一下构造函数,拷贝构造函数,可能还会涉及到赋值函数,析构函数,这些都属于类中的特殊函数.至于以上问题

C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:    int a;public:    CExample(int b)    { a=b;}    void Show ()    {        cout<<

C++拷贝构造函数(深拷贝与浅拷贝)详解_C 语言

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. 复制代码 代码如下: #include <iostream>using namespace std; class CExample {private:    int a;public:    CExample(int b)    { a=b;}    void Show ()    {       

C++友元函数与拷贝构造函数详解_C 语言

一.友元函数 1.友元函数概述: (1)友元函数是定义在一个类外的普通函数. 友元函数和普通函数的定义一样;在类内必须将该普通函数声明为友元. (2)友元函数不是成员函数. 不能通过对象来调用,而是直接调用;友元函数可以访问类的公有.受保护以及私有成员,但是必须通过对象.对象指针或者对象引用来访问. 2.友元函数的声明: friend 返回值类型 函数名(参数表); 在类中只需要将这个声明放置在公有部分即可. class Point { double x, y; public: Point(){

C++中拷贝构造函数的应用详解_C 语言

一.C++中拷贝构造函数的定义: 有一个参数的类型是其类类型的构造函数是为拷贝构造函数. 如下所示: X::X( const X& x); Y::Y( const Y& y, int =0 ); //可以是多参数形式,但其第二个即后继参数都有一个默认值 二.拷贝构造函数的应用: 当一个类对象以另一个同类实体作为初值时,大部分情况下会调用拷贝构造函数. 一般是这三种具体情况: 1.显式地以一个类对象作为另一个类对象的初值,形如X xx=x; 2.当类对象被作为参数交给函数时. 3.当函数返回

C++拷贝构造函数

拷贝构造函数 对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 本文地址:http://www.cnblogs.com/archimedes/p/cpp-copy-constructor.html,转载请注明源地址. 1.对象的定义形式 C++支持两种定义形式:直接初始化和复制初始化,复制初始化采用=符号,直接初始化将初始化式放在圆括号中 用于类类型对象时,直接初始化直接调用与实