注册 登录
编程论坛 C++教室

C++显式调用构造函数创建对象无法正确匹配构造函数?

令狐少侠56 发布于 2017-07-16 15:04, 2211 次点击
HasPtr hp4 = HasPtr(1,str);
一开始我忘记把拷贝构造函数第一个参数设置为const了,HasPtr(const HasPtr& hp)写成了HasPtr(HasPtr& hp)结果出错,
可我觉得这和初始化hp4是没有关系的啊,我想调用的构造函数是HasPtr( int i1,string &str )
程序代码:

#include <iostream>
#include <memory>

using namespace std;

class HasPtr{
public:
    HasPtr() = default;
    HasPtr( int i1,string &str ){
        i = i1;
        ps = &str;
    }
    HasPtr(const HasPtr& hp){
        i = hp.i;
        ps = new string( *hp.ps );
        cout<<"调用拷贝构造函数"<<endl;
    }
    HasPtr& operator=( HasPtr& hp){
        cout<<"调用拷贝赋值运算符"<<endl;
        i = hp.i;
        ps = hp.ps;
        return *this;
    }

    int i;
    string *ps;
};

int main(  ){
    string str = "hello";
    HasPtr hp4 = HasPtr(1,str);
    cout<<hp4.i<<" "<<hp4.ps<<endl;

    HasPtr hp1(1,str);
    cout<<"hp1建立完成"<<endl;
    HasPtr hp2 = hp1;
    HasPtr hp3;
    hp3 = hp1;

    HasPtr* hp5 = new HasPtr(1,str);
    return 0;
}

2 回复
#2
令狐少侠562017-07-16 15:21
HasPtr hp4 = HasPtr(1,str);这里是不是调用拷贝构造函数了?
因为拷贝构造函数第一个参数必须引用类型,但不并不需要是const引用类型啊。
还有如果调用了拷贝构造函数为什么没有输出“调用拷贝构造函数”
#3
yangfrancis2017-07-17 14:05
这就是构造函数吧。哪里涉及到拷贝什么的了?HasPtr hp4(参数1,参数2)这样能不能过呢?
1