警惕!C++里面“=”不一定就是等于(赋值)。
来源:互联网 发布:淘宝怎么退货给卖家 编辑:程序博客网 时间:2024/06/11 01:56
作者 “九天雁翎”,链接http://blog.csdn.net/vagrxie/article/details/1588984
让我们来现在看一个这样的程序:
#include
using namespace std;
class HasPtr
{
public:
int *ptr;
int val;
HasPtr(const int &p,int i):ptr(new int(p)),val(i) { }
HasPtr& operator=(const HasPtr &rhs)
{
ptr = new int;
*ptr = *rhs.ptr;
val =rhs.val;
return *this;
}
~HasPtr()
{
delete ptr;
}
};
int main()
{
int ival = 5;
HasPtr a(ival,5);
HasPtr b = a;
cout<<*(a.ptr);
return 0;
}
这是看起来是一个没有任何问题的程序,并且在指针的回收处理上非常好,用的是值型指针来处理类里面的指针,在VC(以后都是指VC++.net 2005)中编译也可以通过,在Dev-C++4.9.9.0 中编译运行都没有问题。但是在vc中运行却会出问题。原因在哪里?经我论坛发帖求教,是因为HasPtr b = a; 语句其实并不是赋值,而是调用了构造函数。不信?证明如下:
#include <iostream>
using namespace std;
class HasPtr
{
public:
int *ptr;
int val;
HasPtr(const int &p,int i):ptr(new int(p)),val(i) { }
HasPtr(const HasPtr &orig):ptr(new int(*orig.ptr)),val(orig.val)
{
cout<<"Use me(copy constructor)"<<endl;
}
HasPtr& operator=(const HasPtr &rhs)
{
cout <<"Use me(=)"<<endl;
*ptr = *rhs.ptr;
val =rhs.val;
return *this;
}
~HasPtr()
{
delete ptr;
}
};
int main()
{
int ivala = 5;
HasPtr a(ivala,5);
HasPtr b = a;
ivala = 6;
cout<<*(a.ptr)<<*(b.ptr)<<endl;
return 0;
}
这一点在VC和在dev-c++中都是一样的。你会发现调用的都是copy constructor(复制构造函数),不过据说之所以在dev-c++中没有出错,是因为可怜的dev-c++检测能力太差。。。。。。。。。。。
- 警惕!C++里面“=”不一定就是等于(赋值)。
- 警惕!C++里面“=”不一定就是等于(赋值)。
- java里面给对象赋值,慎用赋值符号(=)
- 浮点数不一定等于小数
- Java "==" equals不一定就是比较内容
- =与==赋值与等于
- php中的赋值,等于,完全等于
- new 第四届BOBSLEDDING(不要被省赛的题目吓到,里面不一定有算法)
- 【转】opencv中widthStep不一定等于width*nChannels的原因
- 编程一样可以很带感--1+1不一定等于“2”
- 【转】opencv中widthStep不一定等于width*nChannels的原因
- 【转】opencv中widthStep不一定等于width*nChannels的原因
- 警惕缓冲区溢出(C中那些不安全的库函数)
- 警惕缓冲区溢出(C中那些不安全的库函数)
- 警惕缓冲区溢出(C中那些不安全的库函数)
- 不一定。
- 不一定
- 【C】Malloc与结构体,其实就是C语言里面的new和类
- Linux几个版本的介绍-(Redhat,Debian,Ubuntu,Gentoo,FreeBSD)
- [各种面试题] 前后序遍历统计树
- stl_func STT_FILE
- 使用dlsym动态取用so中函数
- Linux 内存的延迟分配
- 警惕!C++里面“=”不一定就是等于(赋值)。
- 用cocos2d-x画类似心电图的代码例子
- Opengl分格化(libtess)移植与使用
- Java web之doPost()和doGet()
- WIFI驱动结构介绍
- error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMT.
- 第二月实习总结 [大三四八九月实习]
- Oracle笔记之any,some,all以及exists与in的用法
- 关于独立集,覆盖集,支配集与匹配的一些定理及部分简单证明(下)