将C-风格字符串用作string对象引用参数

  • 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

将C-风格字符串用作string对象引用参数的相关文章

C 风格字符串、string 类要点总结

1. C风格字符串 1.1 其它 头文件<cstring> 特殊性质:C风格字符串以空字符\0结尾 1.2 读取一行的区别 1.2.1 cin.getline(array1,n,char) 参数1:存入的数组名字:参数2:要读取的字符数:参数3:可选参数,用所输入的char字符替代\n作为读取结束标记,并把后续可能遇到的\n作为常规字符读取. 功能:读到换行符后边结束,并把'\n'替换为'\0',把读取到的字符串储存到name中 遇到文件结尾设置eofbit,遇到流被破坏(如设备故障)时设置b

String格式化参数整理

Java String格式话参数整理如下: conversion:转换格式,可选的格式有: d 整数型(十进制) c Unicode字符 b Boolean值 s String f 浮点数(十进制) e 浮点数(科学计数) x 整数(十六进制) h 散列码 % 字符串“%” C++ String格式化参数整理如下: 1.转换说明符 %a(%A) 浮点数.十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float和doulbe) %e(%E) 浮点

【共读Primer】19.&lt;3.5&gt; 数组-C风格字符串 Page109

C风格的字符串是指以空字符'\0'结尾的一个字符串. 这种字符串虽然在C++中兼容,但是极易引起内存安全问题,所以不建议使用. 但是作为一个语言特性,我们应该了解它,这样才能在碰到的时候做到心中有数. 3.5.4 C标准库string函数 这里所说的string函数并不是std::string的函数,而是在C的标准库中,对C风格字符串进行操作的一些全局函数. strlen(p); //计算p的长度,不计入空字符结尾 strcmp(p1, p2); // 比较两个字符串p1和p2是否相等,相等返回

C风格字符串和C++ string 对象赋值操作的性能比较

<<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: 1 #include "stdafx.h" 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 #include <ctime> 6 7 using namespace

string字符串转C风格字符串 进而转换为数字

要求如题 头文件stdlib.h中有一个函数atof() 可以将字符串转化为双精度浮点数(double) double atof(const char *nptr); 此字符串为C风格字符串,因此需要将string转化为C风格字符串 此时可用到一个函数c_str() const char *c_str() 参考资料: string中c_str().data().copy(p,n)函数的用法 在使用c_str()时遇到了一个问题–此函数的返回值为const char * 因为是const数据类型,

C#数据结构和算法-字符串、String 类和StringBuilder类

*本文为摘抄笔记* Preface当程序需要对String对象进行许多改变时会用到StringBuilder类.因为字符串和String对象都是不可改变的,而StringBuilder对象则是易变的.String类不可变,就意味着每次对象进行改变时都需要创建一个新的对象副本.如果在创建长的字符串,或者是对相同对象进行许多改变,那么就应该用StringBuilder类来代替.StringBuilder对象是可变的,性能会更好. 字符串是字符的序列,可以包含字母.数字和其他符号.C#语言中,用双引号

字符串(String)几个常用方法的详解

String:(字符串) indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. stringObject.indexOf(searchvalue,fromindex) searchvalue 必需.规定需检索的字符串值. fromindex 可选的整数参数.规定在字符串中开始检索的位置.它的合法取值是 0 到 stringObject.length - 1.如省略该参数,则将从字符串的首字符开始检索. 该方法将从头到尾地检索字符串 stringObject,看它是否含有子串

【C++ Primer每日一刷之八】之八 C 风格字符串

4.3 C 风格字符串 尽管 C++ 支持 C 风格字符串,但不应该在 C++ 程序中使用这个类型.C 风格字符串常常带来许多错误,是导致大量安全问题的根源. 在前面我们第一次使用了字符串字面值,并了解字符串字面值的类型是字符常量的数组,现在可以更明确地认识到:字符串字面值的类型就是const char 类型的数组.C++ 从 C 语言继承下来的一种通用结构是C 风格字符串,而字符串字面值就是该类型的实例.实际上,C 风格字符串既不能确切地归结为 C 语言的类型,也不能归结为 C++ 语言的类型

c风格字符串,字符串字面值,c++字符串

C风格字符串:本质上就是以空字符null为结束符的数组 可以简单的理解为:有'\0'的是c风格字符串,无'\0'的是普通字符数组 字符串字面值:是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示. C++字符串:通俗而言是string类,为和c语言兼容,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.(实际上在c++中,string最好直接理解为一个基本类型,相关操作都封装在string类中,避免使用char *出错) 由下面的代码可以看出: int main()