关于C++函数思考1(缺省的六大函数)
我们知道大神们在设计C++时候就给C++有六个默认的函数,所谓默认就是,无需我们这些程序猿们动手去写,仅仅要你在将类实例化。即创建一个对象,在利用对象进行数据操作时候,就会编译器自己主动调用默认的函数,可是默认函数并非C++希望我们使用的,真正强大的是我们在这些默认的基础之上。自己 DIY函数来实现默认函数所不能做到的和它能做到,仅仅有这样才干将自己的功力大增。以下是我在编写C++ 函数时候产生的一些思考:
六个默认的函数依次是:
//C++ 的六个默认函数 //在使用的时候那些函数时透明的。就是那些函数学了一招隐身技术 啊哈哈哈啊 class Default { public: /* Default(){}//缺省构造函数 Default(const Default&){}//拷贝构造函数 ~Default(){}//析构函数 Default& operator=(const Default&){}//赋值运算符 Default* operator&(){}//取址运算符 const Default* operator&()const{}//取址运算符 const */ private: int m_Data; }; int main() { Default t;//调用构造函数 Default t1=t;//Default t1(t); //调用拷贝构造函数 Default t2;t2=t; //调用赋值函数 Default *pt = &t;//调用取址函数 const Default t3; const Default *pt1 = &t3;//调用const取址函数 //调用析构函数 return 0; }
C++的强大之处不在于有多少默认缺省的封装的方法。而是,在与在满足这些基本函数的基础上给予编程者最大的创造空间。
这些默认的函数仅仅能保证C++的正常模式,在此基础之上有极大的接口空间来设计与实现方法
1.我们看一个程序
/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 4 5 * **********************************************************************/ #include<iostream> using std::cout; using std::cin; class S { public: //当使用自己定义构造函数的时候编译器就不会调用默认的构造函数 S(int i=0,double n=0):m_data(i),data(n) { cout<< this<<"\n"; } private: int m_data; double data; }; int main() { S s0; //1 //此时就是我们自己定义了构造函数编译器就不会再调用默认的无參构造函数。 //假设想要这么做,必须自己定义一个无參构造函数,或者自己定义缺省的构造函数, //就像上面函数的那样,也就是说假设么有缺省值,就会报错,由于找不到相应的构造函数 S(10);//2 S(10.8); //3 S((int)10.8);//4 S ss(10,20);//5 S ss1(10.8);//6 S ss2((int)10.8);//7 S s(10,10.8);//8 //调用了构造函数 S s1 = (S)(10,10.8);//9 }
下来我们验证一下:
/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 4 5 * **********************************************************************/ #include<iostream> using std::cout; using std::cin; class S { public: //当使用自己定义构造函数的时候编译器就不会调用默认的构造函数 //explicit 仅仅对构造函数起作用,用来抑制隐式转换。S(int i=0,double n=0.0):m_data(i),data(n) { cout<<"Create S obj:"<< this<<"\n"; } S(const S &t) { cout<<"Copy Test Obj : "<<this<<"\n"; m_data = t.m_data; } S& operator=(const S &t) { cout<<"Assgin:"<<this<<" : "<<&t<<"\n"; if(this != &t) { m_data = t.m_data; } return *this; } ~S() { cout<<"Free S Obj :"<<this<<"\n"; } private: int m_data; double data; }; int main() { S(10);//1 S ss(10,20);//2 S ss1(10.8);//3 S ss2((int)10.8);//4 S s(10,10.8);//5 S s1 = (10,10.8);//6 S s2; //7 s2=(10,10.8); }