Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串赋值运算符C++;_C++_String_Pointers_Reference_Operators - Fatal编程技术网

C++ 字符串赋值运算符C++;

C++ 字符串赋值运算符C++;,c++,string,pointers,reference,operators,C++,String,Pointers,Reference,Operators,我正在浏览字符串类的赋值运算符的一些代码,其中有一些概念我不理解 1) 参数是一个常量,但值最终会改变,我认为常量不能改变 2) 传递字符串参数的地址,然后在if语句中再次访问该地址,难道不能省略符号and,因为应该已经使用“right”访问该地址了吗 String&String::operator=(const String&right)//为什么传递const?是否分配了新值? { if(this!=&right)//这不能是if(this!=right) { delete[]buffer;

我正在浏览字符串类的赋值运算符的一些代码,其中有一些概念我不理解

1) 参数是一个常量,但值最终会改变,我认为常量不能改变

2) 传递字符串参数的地址,然后在if语句中再次访问该地址,难道不能省略符号and,因为应该已经使用“right”访问该地址了吗

String&String::operator=(const String&right)//为什么传递const?是否分配了新值?
{
if(this!=&right)//这不能是if(this!=right)
{
delete[]buffer;//去掉旧的缓冲区len=right.length();
缓冲区=新字符[len+1];
对于(int i=0;i
请以后单独发布问题

在(1)中,你混淆了作业的两个方面。右边是常量
a=b
绝对不会改变b


(2) 您传递的是表达式,而不是地址
right
是对该表达式的引用<代码>另一方面,这是一个指针。检查你的书,这是基本的C++。

字符串作为const引用传递,而不是const指针。因此,检查必须是
this!=&右键
获取指向指针比较的指针。

1)如果传入常量引用,则表示不能更改
右键
参数,但可以更改
的内容


2)
这是一个指针<代码>右侧
是一个参考。它们不一样,所以你不能直接比较。在对两个字符串A和B调用赋值运算符时,可以使用
&right
获取引用的地址,例如,A=B,字符串B作为常量引用传入。字符串A是正在修改的内容


在这条线上!=&对,我们将它(指向=号左侧的字符串的指针)与&right(等号右侧的字符串地址)进行比较。将指针与字符串进行比较是没有意义的,如果我们使用它,就会发生这种情况!=对

指针不只是一个内存地址吗?这不是吗!=对,只是比较两个内存地址吗?
这是一个指向调用
运算符=
的字符串的指针
right
是对字符串的常量引用。所以
这个!=右
将尝试将指向字符串的指针与常量字符串进行比较。您必须使用
&
来获取Right的地址,但参数中传递的地址不是吗?不仅仅是字符串,还有地址?从技术上讲,字符串的常量引用可能作为指针传递。但是,在函数中,引用被视为与对象完全相同的对象(假定函数是
operator=(String right)
the“不必要的”复制将使
this!=&right
比较毫无意义!副本具有唯一地址。测试
this!=&right
捕获
A=A
大小写。这很重要,因为上面的代码在复制
right.buffer
之前调用
delete[]this->buffer
。如果参数为(const String&right)这不是意味着“right”作为地址传递吗?所以当你写这个时!=right你不是在比较指针“this”指向的地址和地址“right”吗指向?我想在if语句中说&right对于获取地址是多余的,因为地址已经作为参数传递了?我认为您混淆了引用和指针之间的一个重要区别。当参数列为(const String&right)时,这意味着right是作为引用传递的,而不是指针。因此,函数中出现right的任何位置都被视为string对象(尽管它是对传入字符串的引用)。因此,在程序中,要获取right的内存地址,必须写入&right(获取引用的地址,该地址与被引用的原始字符串的地址相同)。
String& String::operator=(const String& right) //why is const passed is a new value gets assigned?
  {
     if (this != &right) // Cant this be if(this != right)
        {
           delete[] buffer; // Get rid of old buffer len = right.length();
           buffer = new char[len + 1];
           for (int i = 0; i < len; i++)
             buffer[i] = right[i];
            buffer[len] = '\0';
        }  
     return *this;
  }