C++拷贝构造函数与函数声明的区分

来源:互联网 发布:51单片机蓝牙模块 编辑:程序博客网 时间:2024/06/05 20:01

C++拷贝构造函数与匿名对象的存在使函数调用过程中很容易出现因为匿名对象做拷贝构造函数参数搅成一坨构成函数声明的结构,导致定义了一条没有作用的函数声明语句;

以下代码可以用于验证区分函数声明与给匿名对象起别名的情况。

#include <iostream>
using namespace std;

class A
{
public:
A()
{
cout << "无参构造函数" << endl;;
}
A(int a)
{
cout << "int参数构造函数" << endl;;
}


A(A& obj)
{
cout << "拷贝构造函数" << endl;;
}
protected:
int x;
};


int main()
{
A obj(A(10));//先执行A(10)构造函数,返回匿名对象;再给匿名对象起别名obj (编译器优化不会调用拷贝构造函数)
A obj5();//函数声明
A obj0;//对象定义

A obj1(A(obj2));    //函数声明语句
A obj3(A obj4());//函数声明内部嵌套一个函数声明——回调函数

/*   void PrintList(void * list, void print(void *data));
//常见的回调函数
typedef void(*PrintData)(void *data);
void PrintList(void * list, PrintData print);    */

A obj6(A obj7);//函数声明与A obj1(A(obj2));等价
return 0;
}


总结:函数声明常见结构 int fun(int a);   //声明大括号内部有参数类型int  

  回调函数常见结构  int fun1( int fun2(  ) )    

  建立匿名对象再起别名结构   classA   obj1( classA   (  10)   ) ;  

//classA (10)没有歧义会直接调用构造函数,调完构造函数后 得到一个匿名对象,匿名对象起别名结构:classA    obj1( obj2);

          拷贝构造函数结构A tmp2 = A(obj2);  或A tmp( obj );
A tmp2( A(obj2) ); //大括号内部obj2还没有实例化,没有构造函数实例化它,因而括号可以看作结合律限定符,整条语句等价于A tmp2 (A   obj2)//很明显的函数声明格式


0 0
原创粉丝点击