【C++、Java、JavaScript】String问题

多数情况下,基本类型直接代表了最底层的语言实现。所有基本类型的值都是不可改变的。
而string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。
但是他又和普通的引用类型有所不同。
由于string对象的不可变,所以可以共享。对String类的任何改变,都是返回一个新的String类对象

一般而言表现如下:

  • int等原始值类型,直接复制一份,传到函数里修改,原值不变。
  • 引用类型如int[] a,传到函数里修改,原值会修改。
  • string类型,虽然是引用类型,但情况和int一样,会被复制,传到函数里修改,原值不变。
  • 如果使用==号判断,则是直接判断两个字符串是否相等,而不是使用地址。

https://wenku.baidu.com/view/8a0d6acde309581b6bd97f19227916888486b920.html

单纯的C++里:

C++里String的情况可以看作原始值类型。且不论怎么定义,其表现都和原始值类型一样。
(1)string s1; —> // 默认初始化,s1是一个空字符串
(2)string s2 = s1; —> // s2是s1的副本,注意s2只是与s1的值相同,并不指向同一段地址
(3)string s3 = “hiya”; —> // s3是该字符串字面值的副本
(4)string s4(10, ‘c’); —> // s4的内容是: “cccccccccc”

	string a("foo");
	string b = "foo";
	cout<< (a==b) << endl;	// true
	
	string a1 = a;
	a = "bar";
	cout << a1 << endl;		// foo

上述例子可以看到,修改了a的值后,a1并没有变化,这不就是原始值类型的表现嘛。

https://blog.csdn.net/weixin_59649214/article/details/122741032
因此在函数里把String作为参数,修改该值,不会影响原来的值,所以如果要影响原址,要在参数前面加&
比如

// ①
void test1(string s){
    s="bar";
}
int main(){
    string s{"foo"};
    test(s);
    cout<<s<<endl;// foo
}
// ②
void test(string &s){
    s="bar";
}
int main(){
    string s{"foo"};
    test(s);
    cout<<s<<endl;// bar
}

不单纯的Java:

正常情况下表现是一个原始值类型。

	String str1 = "Foo";
	String str2 = "Foo";
	System.out.println(str1 == str2);	// true

	String str1_1 = str1;
	str1 = "Bar";
	System.out.println(str1_1);			// Foo

而我们可以通过特殊的方式改变一下他,让他变成真正的引用值类型
可以看到下面的例子,直接用==判断已经不行了,因为它们指向了不同的地址。

	String str1 = new String("Foo");
	String str2 = new String("Foo");
	System.out.println(str1 == str2);	// false

	String str1_1 = str1;
	str1 = "Bar";
	System.out.println(str1_1);			// Foo

解释看https://blog.csdn.net/weixin_53236070/article/details/123594927

不单纯的JavaScript

JavaScript里String是原始值类型,也可以是引用类型。

let s1 = "Foo";
let s2 = "Foo";
console.log(s1==s2);	//true

下面是引用类型的例子。

	let str1 = new String("Foo");
	let str2 = new String("Foo");
	console.log(str1 == str2);		// false

	let str1_1 = str1;
	str1 = "Bar";
	console.log(str1_1);			// [String: 'Foo']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值