- string类定义了一种char*到string的转换功能,这使得可以使用C-风格字符串来初始化string对象。
- 类型为const引用的形参其中一个属性表明:假设实参的参数类型与引用参数不匹配,但可以转换为引用类型,程序将创建一个正确类型的临时变量,使用转换后的实参值来初始化它,然后传递一个指向该临时变量的引用。
从上面两条属性我们得知: 如果形参类型为const string &,在调用函数时,使用的实参可以是string对象或者C-风格字符串,如用引号括起来的字符串字面量,以空字符结尾的char数组或指向char的指针变量。 - 上面提到const引用为形参的属性,也就是说,如果引用的参数是const,则编译器在某些情况下会生成临时变量,比如下面这两种情况:
1, 实参类型不正确,但可以转换为正确类型。
2, 实参类型正确,但不是左值。
- 下面我们来看代码实例。
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 string version(string &a, const string &b); 7 8 int main(void) 9 { 10 string input = "I love you."; 11 cout << "input address: " << &input << endl; 12 const char* b = "***"; 13 cout << "i b address: " << &b << endl; 14 15 version(input, b); 16 17 return 0; 18 } 19 20 string version(string &a, const string &b) 21 { 22 using namespace std; 23 cout << "a address: " << &a << endl; 24 cout << "b address: " << &b << endl; 25 return a;//没有这句会产生内存错误。返回引用。 26 } 27 /************************************ 28 * input address: 0x7ffe09a647f0 29 * i b address: 0x7ffe09a647e8 30 * a address: 0x7ffe09a647f0 31 * b address: 0x7ffe09a64840 32 * **********************************/
其中,input是string对象,应用了string类定义了一种char*到string的转换功能,将字符串字面量转为string对象。b则是char*型,作为实参时函数会创建一个临时变量。看代码得知,b在main中的地址是:i b address: 0x7ffe09a647e8 ,而在version中的地址是:b address: 0x7ffe09a64840 。它们不一样,说明了函数却实是没有传递char *b的引用,而是临时变量。又看string类input,在main中和在version中的地址是一样的。说明是传递了input的引用。
时间: 2024-11-07 14:27:15