string对象和C风格代码的混用

我们都知道可以用已下方式来初始化string对象:

string  s(“hello world!”);

实际上我们也可以通过这样的方式来实现:

char c[] = {‘h’,‘e’,‘l’,‘l’,‘o’,‘  ‘,‘w’,‘o’,‘r’,‘l’,‘d’,‘!’,‘\0’};

string s = c;

但是如果数组c不是以空字符结尾的话,那么上面的赋值就是不正确的。

实际上,任何出现字符串字面值(即上面的“hello world!”这种形式)的地方都可以用以空字符结束的字符数组来替代。注意点如下:

1、可以使用以空字符结尾的字符数组来初始化string对象或者给string对象赋值

2、在string对象的加法运算中,可以使用以空字符结尾的字符数组作为其中一个运算对象,但是不能两个都是。在string的加法运算中,要至少保证有一个为string对象。例如:

char a[] = {‘a’,’\0’};

char b[] = {‘b’,’\0’};

string c = “abdc” ;

string d = “abcd” + a; //错误,赋值运算右侧没有string对象

string e = a+b;      //错误,赋值运算右侧没有string对象

string f = c +a;    //正确

string对象可以用以空字符结尾的字符数组进行操作,但是反过来却不行。不能用string对象对字符指针进行任何操作。不过为了完成从string对象到字符指针的转变,string专门提供了一个c_str成员函数(顾名思义,就是返回c的字符串指针):

string a = “hello world!”;

char *str = s;    //错误

const char *str = s.c_str();   //正确

但是,这样的写法无法保证c_str函数返回的数组一直有效,因为如果后续操作改变了s的值,那么之前返回的数组可能就变了。 比如:

string d = "abc";

const char *c = d.c_str();

cout << c <<endl;

d = "efg";

cout << c<< endl;

则输出的结果为:

abc

efg

可以看出string对象变化了,即使我们没有将变化后的值重新赋值给c,但是其结果仍旧跟着变了。所以如果我们想保存当前的字符串,那么最好将结果重新拷贝一份。

时间: 2024-08-25 20:55:37

string对象和C风格代码的混用的相关文章

Java系列2 --- 你真的知道Java的String对象么?

?在上一篇中说道这篇文章会说java的动态绑定机制,由于这个知识点放在继承中讲会比较合适,说以在这篇文章中先来详细的说说String对象吧. ?只要学过Java的同学,我们都知道Java一共有8中基本类型,但是在Java中最常用的String类型却不属于这8中基本类型中.他是Java.lang包中的一个类.但是String对象在引用传递中JVM的处理却与其他对象不同. ?在正式开始来讲这个String对象的时候我们首先来简单的说明下Java中的值传递和引用传递.正如很多Java说熟知的那样,Ja

我的Java开发学习之旅------&gt;Java String对象作为参数传递的问题解惑

又是一道面试题,来测试你的Java基础是否牢固. 题目:以下代码的运行结果是? public class TestValue { public static void test(String str) { str="World"; //代码3 } public static void main(String[] args) { String string = "Hello"; //代码1 test(string); //代码2 System.out.println(

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 str = new String(&quot;abc&quot;),这段代码一共生成了几个String对象?为什么?

String str = new String("abc")创建了俩个对象,首先为创建一个String对象"abc",然后在调用String类的构造方法时 1 public String(String original) { 2 //other code ... 3 } 再次创建了一个对象original,并把"abc"这个对象传给original,进而赋值给str. 所以一共创建了2个对象.

string 对象及其操作

标准库类型string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准库的一部分,string定义在命名空间std中.接下来的示例都假定了已包含了下述代码: #include <string> using std::string; 本节描述最常用的string操作. 定义和初始化string对象 如何初始化类的对象是由类本身决定的.一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量有所区别,或者是初

string对象的几种构造方法

在某种程度上,可以将string类型视为字符容器,支持很多容器操作.与vector相似,string的字符也是连续存储的,因此也有capacity和reserve操作.另外,也可用迭代器输出字符串,如下例: string s("Hello world!"); string :: iterator iter = s.begin(); while(iter!=s.end()) { cout << *iter; } 在创建一个string对象并初始化时,有以下几种方法(ch1.c

String s=new String("xyz");创建几个String对象的问题

首先让我们了解几个概念: 栈 :由JVM分配区域,用于保存线程执行的动作和数据引用. 堆 :由JVM分配的,用于存储对象等数据的区域. 常量池constant pool :在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.这是一个特殊的共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里. 进入正题: String a = "abc";①String b = "abc";② 使用String a = "abc

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数据类型,

数组对象元素的添加,String对象,BOM对象以及文档对象的获取

数组对象的删除有三种方法: pop();        //移除最后一个元素并返回该元素值shift();      //移除最前一个元素并返回该元素值,数组中元素自动前移splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所移除的元素通过这三种方法我们可以将数组中的元素按进行删除 var del = ["aa",23,345,56,34,"bb"]; var del_last = del.pop()