这个字符串是char*字符串仍是string字符串呢
这个字符串是char*字符串还是string字符串呢?
------解决方案--------------------
c++中接受一个形参的隐式转化
第一个是string引用,char*指针和string&之间并没有可用的转换方式,所以一定不会使用第一个函数
第二个const char * 和char *可以隐式转化,自然用第二个
------解决方案--------------------
当然是char*的,因为另外一个是string类的引用,char*和string类,是完全不同的类型。
这就是函数重载的功能啊。
------解决方案--------------------
第一个是不可能的, 因为如果要先转化成std::string的话, 需要生成临时对象,而std::string&是不能绑定到临时对象的。
------解决方案--------------------
A(name) 这种无对象名的构造方式,只能用在函数参数,或返回值中。单独的 A(name)等价于 A name,也就是说,变成用A的默认构造函数构造一个名为name的对象,而此时你的name又是一个string.所以报错。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class A
{
private:
string a;
public:
A();
A (string &myname) //以string字符串的引用作为形参
{
a = myname;
cout<<myname<<" has been constructed in string \n";
}
A(char *myname) //以char*字符串作为形参
{
a = myname;
cout<<myname<<" has been constructed in char* \n";
}
~A()
{
cout<<a<<" destroyed.\n";
}
};
int main()
{
A("abc"); //只传递这样一个字符串,它选择哪个构造函数进行配对?
//编译运行的结果是与char*作为形参的构造函数配对,为什么?
return 0;
}
------解决方案--------------------
c++中接受一个形参的隐式转化
第一个是string引用,char*指针和string&之间并没有可用的转换方式,所以一定不会使用第一个函数
第二个const char * 和char *可以隐式转化,自然用第二个
------解决方案--------------------
当然是char*的,因为另外一个是string类的引用,char*和string类,是完全不同的类型。
这就是函数重载的功能啊。
------解决方案--------------------
第一个是不可能的, 因为如果要先转化成std::string的话, 需要生成临时对象,而std::string&是不能绑定到临时对象的。
------解决方案--------------------
如果要用到以string &为形参的第一构造函数,需要创建对象,如:string name = "tyu";
A b = A(name);
这样可以正确编译运行。但是如果直接写成string name = "rty";
A(name);
会出错
error C2371: 'name' : redefinition; different basic types
我常常认为左边那部分可以省掉,但实际上不行。为什么?
A(name) 这种无对象名的构造方式,只能用在函数参数,或返回值中。单独的 A(name)等价于 A name,也就是说,变成用A的默认构造函数构造一个名为name的对象,而此时你的name又是一个string.所以报错。