苹果手机通话声音小怎么调自动声音调小,是为什么

& C++编译器自动生成的函数
C++编译器自动生成的函数
& & & &在中当创建一个空类时,C++就会默认的为这个类创建4个函数:默认的、拷贝构造函数、以及赋值操作符。本文参考Effective C++介绍这几个函数。&& & & &一. 函数的原型以及函数创建的时机& & & &C++中创建一个空类:
class&Empty&{};&&& & & &默认会生成4个函数,其函数的原型如下:
&&&&Empty()&{&...&}&&
&&&&Empty(const&Empty&&rhs)&{&...&}&&
&&&&~Empty()&{&...&}&&
&&&&Empty&&operator=(const&Empty&&rhs)&{&...&}&&& & & &说明:1) 这些函数只有在需要调用的时候,编译器才会生成。2) 4个函数都是public的。3) 4个函数都是inline的(即函数定义在类的定义中的函数)。4) 如果你显式的声明了这些函数中的任何一个函数,那么编译器将不再生成默认的函数。& & & &比如,当遇到下列语句时,函数会被编译器生成:
Empty&e1;&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
Empty&e2(e1);&&&&&&&&&&&&&&
e2&=&e1;&&&&&&&&&&&&&&&&&&&& & & &另外,还存在两种默认的函数:就是取地址运算符和取地址运算符的const版本,这两个函数在《Effective C++》中没有提及。
&&&&Empty*&operator&()&{&...&}&&
&&&&const&Empty*&operator&()&const&{&...&}&&& & & &这两个函数是确实存在的,正如下面的代码可以正常工作:
#include&&stdio.h&&&
class&Empty&{&&
int&main(int&argc,&char**&argv)&&
&&&&&&&&Empty&a;&&
&&&&&&&&const&Empty&*b&=&&a;&&
&&&&&&&&printf(&%p\n&,&&a);&&&&&&&&&&&&&&&
&&&&&&&&printf(&%p\n&,&b);&&&&&&&&&&&&&&&&
}&&& & & &一个容易被忽略的问题:自定义的拷贝构造函数不仅会覆盖默认的拷贝构造函数,也会覆盖默认的构造函数。下面的代码是编译不过的,用户必须再显式的定义一个无参的构造函数。
class&Empty&&&
&&&&Empty(const&Empty&&e)&{&}&&&&&&
int&main(int&argc,&char**&argv)&&
&&&&Empty&a;&&
}&&& & & &二. &赋值操作符存在的问题& & & &赋值操作符函数的行为与拷贝构造函数的行为基本是相同的,编译器生成赋值操作符函数是有条件的,如果会产生无法完成的操作,编译器将拒绝产生这一函数。那么什么时候编译器无法完成赋值这一行为呢?考虑如下情形(来源Effective C++):
template&class&T&&&
class&NameObject&{&&
&&&&NameObject(std::string&&name,&const&T&&value);&&
private:&&
&&&&std::string&&nameV&&&&&&
&&&&const&T&objectV&&&&&&&&&
};&&& & & 然后考虑下面的语句会发生什么事:
std::string&newDog(&abc&);&&
std::string&oldDog(&xxx&);&&
NameObject&int&&p(newDog,&2);&&
NameObject&int&&s(oldDog,&10);&&
p&=&s;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & & &赋值语句之前,p.nameValue指向newDog, s.nameValue指向oldDog。那么赋值之后呢?p.nameValue应该指向s.nameValue指向的对象吗?但是C++有一条规定:引用不能改指向另外一个对象。& & & &对于变量objectValue,C++规定:更改const成员是不合法的。& & & &因此如果上面两种情形中的任何一种发生了,C++编译器给出的响应是:拒绝编译这一行的赋值动作。如果你这么做了,C++编译器会报错。如果你执意要进行赋值操作,那么可以自己定义一个赋值操作符重载函数。& & & &三. c++0x中的新变化& & & &C++0x中引入了&右值引用&和&移动语义&的概念,可以实现对右值的引用。& & & &移动语义,简单来说,就是在一个右值对象的生命期结束之前,将其资源偷过来,为我所用。有关移动语义的详细内容不做详述,这里要说明的是移动构造函数和移动赋值运算符。& & & &1. 移动构造函数和移动赋值运算符重载函数不会隐式声明,必须自己定义。& & & &2. 如果用户自定义了拷贝构造函数或者移动构造函数,那么默认的构造函数将不会隐式定义,如果用户需要,也需要显式的定义。& & & &3. 移动构造函数不会覆盖隐式的拷贝构造函数。& & & &4. 移动赋值函数不会覆盖隐式的赋值运算符重载函数。
除非特别注明,文章均为原创
转载请标明本文地址:
作者:鸡啄米
&&( 22:26:56)&&( 9:2:13)&&( 15:56:3)&&( 16:53:30)&&( 12:54:35)&&( 10:11:7)&&( 16:20:38)&&( 9:23:12)&&( 16:13:10)&&( 13:16:12)
完全随机文章> 问题详情
C++中的空类,默认产生哪些类成员函数?
悬赏:0&答案豆
提问人:匿名网友
发布时间:
C++中的空类,默认产生哪些类成员函数?
为您推荐的考试题库
您可能感兴趣的试题
110. 以下两条输出语句分别输出什么?float a = 1.0f;cout && (int)a &&cout && (int&)a &&cout && boolalpha && ( (int)a == (int&)a ) && // 输出什么?float b = 0.0f;cout && (int)b &&cout && (int&)b &&cout && boolalpha && ( (int)b == (int&)b ) && // 输出什么?211. 以下代码有什么问题?typedef vector IntAIntAarray.push_back( 1 );array.push_back( 2 );array.push_back( 2 );array.push_back( 3 );// 删除array数组中所有的2for( IntArray::iterator itor=array.begin();itor!=array.end(); ++itor ){if( 2 == *itor ) array.erase( itor );}
我有更好的答案
相关考试课程
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
找答案会员
享三项特权
找答案会员
享三项特权
找答案会员
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码:C++空类默认函数详细解析
字体:[ ] 类型:转载 时间:
如果你只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数、一个拷贝默认构造函数、一个默认拷贝赋值操作符和一个默认析构函数
定义一个空的C++类,例如
class Empty{}
一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,一般编译过去就相当于 代码如下:class Empty{public:Empty(); // 缺省构造函数Empty( const Empty& ); // 拷贝构造函数~Empty(); // 析构函数Empty& operator=( const Empty& ); // 赋值运算符Empty* operator&(); // 取址运算符const Empty* operator&() // 取址运算符 const};一般的书上好像都是前面四种:默认构造函数,拷贝构造函数,默认赋值函数以及析构函数,后面两种其实属于,但要需要注意的是,只有当你需要用到这些函数的时候,编译器才会去定义它们。如果你只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数、一个拷贝默认构造函数、一个默认拷贝赋值操作符和一个默认析构函数。这些函数只有在第一次被调用时,才会别编译器创建。所有这些函数都是inline和public的。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 苹果手机通话声音小怎么调 的文章

 

随机推荐