我们知道大神们在设计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);
}