本文主要是介绍C++含有const的传递和返回,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
例程参考:C++编程思想第二卷 260页
C++编译器默认由一个对象产生一个新对象时采用位拷贝方式!!
#include <fstream>
#include <string>
using namespace std;ofstream out("HowMany.out");
class HowMany
{static int objectCount;
public:HowMany(){objectCount++;}static void print(const string& msg=""){if (msg.size()!=0){out<<msg<<":";}out<<"objectCount="<<objectCount<<endl;}~HowMany(){objectCount--;print("~HowMany()");}
};
int HowMany::objectCount=0;
//值传递
HowMany f(HowMany x)//按值传递会立即产生该对象的副本
{x.print("x argument inside of f()");return x;
}int main()
{HowMany h;//调用构造函数HowMany::print("after construction of h");HowMany h2=f(h);//值传递:调用默认拷贝构造函数,函数返回调用1次析构函数;h2=f(h)赋值:调用一次拷贝构造函数;现在等于调用1次构造函数,调用2次默认拷贝构造函数,然而默认拷贝构造函数都是位复制,并未产生新对象,只是将一个对象的地址,赋给了其他两个,所以整个过程只有一个对象,却调用了三次析构函数HowMany::print("after call to f()");
}
防止按值传递
用户在类中定义一个拷贝构造函数,语法:
NoCC(const Nocc &)
函数体内可以什么都不做;如果再发生按值传递的调用,编译器会自动提示错误;
const在函数调用时的用法:参考 C++编程思想第二卷 194
一、按值传递和返回
①值传递:表示不可改变
②值返回:不可作为左值使用
若为内建类型,const应去掉,以免混淆
二、传递和返回地址
1.地址传递:临时变量可以传递给接受const引用的函数,而不可以传递给接受指针的函数,见195;
可以把非const类型传递给const类型,但是反过来不行;
2.地址返回:
总之,
可以把非const类型传给const类型,返回来却不行
传递时,两个作用:一是表示不能改变,二是可以接受临时量
返回时,表示不能作为左值
PS:C++中的临时量
①有返回值的函数返回时,产生一个临时量,语句执行完毕时,自动删除;
②函数调用时,按值传递传递的参数会立即产生一个副本
它们自动的生成为常量,改变临时量是错误的;
这篇关于C++含有const的传递和返回的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!