C++赋值操作符

原创 2013年12月01日 20:17:14

class String{

public:

String & operator=(const String &s);

private:

char *data;

}



String & String::operator=(const String &s);

{

if(&s != this)

{

delete [] data;

data = new char[strlen(s.data)+1];

strcpy(data,s.data);

}

return *this;

}

String & String::operator=(const String &s);

{

char *newdata = new char [strlen(s.data)+1];

Strcpy(newdata,s.data);

Delete [] data;

Data = newdata; 

return *this;

}

在C++的学习中,有人经常搞不清楚“常量指针”和“指针常量”这两个概念。其实简单一点讲,“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的。


     下面看及格简单的例子,可以说明他们的区别:
            第一个

 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     ptr1 =str2; //错误 因为这是一个常量指针,改变指向的地址了
 8 
 9     printf("%s \n",*ptr1);
10     }
11 
12 
13 // 编译错误    error C3892: 'ptr1' : you cannot assign to a variable that is const    
14 


第二个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     *ptr1 ='A';// 正确 因为指向的地址的内容是可以变化的
 8 
 9     printf("%c \n",*ptr1);
10     }
11 
12 //输出  A
13 

第三个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str1;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1=str2;// 正确 因为指向的地址是可以变化的
 8 
 9     printf("%s \n",ptr1);
10     }
11 
12 //输出 Hello World

第四个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str2;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1='A';// 错误 因为指向的地址是内容是不可以变化的
 8 
 9     printf("%c \n",ptr1);
10     }
11 
12 
13 //编译错误    error C2440: '=' : cannot convert from 'char' to 'const char *'

C++运算符重载(3) - 什么时候需要自定义赋值操作符

答案与拷贝构造函数一样。如果一个类不包含指针,则不需要自定义赋值操作符与拷贝构造函数。编译器会给每个类创建一个默认的拷贝构造函数和默认的赋值操作符。但是,当类中包含有指针或任何运行时分配的资源时,编译...
  • shltsh
  • shltsh
  • 2015年05月26日 09:32
  • 1114

【C++】拷贝构造函数与赋值操作符的本质性区别分析

在C++中,牵扯到两个对象相互初始化,赋值,经常会调用拷贝构造函数和赋值操作符,许多新手也经常在此迷惑,究竟何时调用拷贝构造函数,何时调用赋值操作符呢? 在语法层面上来说,当你需要用一个已经存在的对...
  • sryan
  • sryan
  • 2012年08月13日 14:57
  • 1810

没有躲过的坑--重载赋值运算符的自我赋值

C++中有个很重要的事情,就是对于类重载赋值运算符,而达到我们想要的结果。 先看看这几行代码://Window 是一个类 Window w; w = w; // 再傻的人也不会这么...
  • wangshubo1989
  • wangshubo1989
  • 2015年11月21日 12:26
  • 1598

C++拷贝构造函数和赋值运算符根本的不同

首先要说明的是,若用户没有定义,C++隐式声明一个拷贝构造函数和一个赋值运算符(完成按数据成员复制的动作)。二者很像,但是在下边这点上有很大的不同:拷贝构造函数是只在对象实例化时才会被调用,也就是说,...
  • u012861978
  • u012861978
  • 2017年07月10日 15:46
  • 170

派生类的赋值运算符也必须处理它的基类成员的赋值(源自effictive c++)

派生类的赋值运算符也必须处理它的基类成员的赋值!看看下面: class base { public:   base(int initialvalue = 0): x(initialvalue) ...
  • mafuli007
  • mafuli007
  • 2012年02月03日 16:41
  • 797

批注:C++中复制构造函数与重载赋值操作符总结:默认浅拷贝,带指针的需要深拷贝

notes:这两个函数默认浅拷贝,带指针的需要深拷贝.需要重写这两个函数 前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 复制构造函数和重载赋值操作符的定义;复...
  • fdsafwagdagadg6576
  • fdsafwagdagadg6576
  • 2016年06月20日 22:38
  • 454

浅谈c++复制构造函数和赋值操作符。

何时调用: 1,如果变量没有声明过,那么将会调用复制构造函数。如: A a; A a2=a;//调用复制构造函数将a复制到a2. 2,如果变量已经声明过,将会调用赋值操作符。 A a...
  • lchli1314
  • lchli1314
  • 2015年06月03日 14:42
  • 259

博览网_C++_第二周_Rectangle类的初步实现(一)

喜欢的朋友可以关注收藏一下: http://blog.csdn.net/qq_31201973 本文实现了一个date类型,原版要求如下: 为 Rectangle 类实现构造函数,拷贝构造函数,赋值...
  • qq_31201973
  • qq_31201973
  • 2017年04月27日 17:39
  • 301

C++类继承下的赋值运算符

class Base { public: Base& operator=(const Base& rhy); Base(int val=0); private: int value; ...
  • gettogetto
  • gettogetto
  • 2016年01月20日 15:16
  • 1038

关于C++中类的默认赋值操作符

#include "stdafx.h" class Class1 { public: Class1(){} ~Class1(){} Class1& operator=(const Class...
  • cay22
  • cay22
  • 2014年09月27日 09:35
  • 1526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++赋值操作符
举报原因:
原因补充:

(最多只允许输入30个字)