这个字符串是char*字符串仍是string字符串呢

这个字符串是char*字符串还是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;
}

------解决方案--------------------
引用:
Quote: 引用:

传入的参数虽然类型略有区别,但是显然传入的参数可以转化成第2个函数需要的值类型


为什么要转成第2个函数呢?

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.所以报错。