一,C++几个特殊函数;
1,在定义一个类的时候,如果程序员没有显示的定义一下几个东西的话,编译器会自动为你生成以下的几个成员;
1)缺省构造函数.(无参)
2)拷贝构造函数
3)赋值运算符.
4)取地址运算。
5)析构函数
也就是说你定义一个class Empty(){};
跟你定义一个
class Empty{
public:
Empty(); // 缺省构造函数
Empty(const Empty& rhs); // 拷贝构造函数
~Empty(); // 析构函数 ---- 是否
// 为虚函数看下文说明
Empty&
operator=(const Empty& rhs); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const;
};
是一样的。
2,这样也就决定了几个问题:
1)在继承的过程中,构造函数,析构函数,赋值运算符,拷贝构造函数不会被继承。
2)如果在派生类中没有显示的定义,编译器会为你做初始的定义!
二,类层次中的向上向下类型转化;
1,层次中对指针或者是引用进行类型的向上转化是安全的也不需要显示的转化,这也是虚函数实现动态的一个方法!
2,层次中如果使用对象来直接进行类型的向上转化的话,那么将会发生"对象切片"的问题。
也就是说最后转化后的对象只保留上一个层次中所能拥有的接口!
3,层次中向下类型转化,是不确定也不是安全的。也是需要显示才能作出转化的。通常的话有两种转化方式,一种是
dynamic_cast<Derived*>(base*);
另外一种是静态的转化: static_cast<Derived* >(base*);
显然静态的转化所需要的空间以及系统资源较少,但是动态的较多;
所以在可以确定转化的类型的时候,可以配合RTTI(run-time-type-information)来使用静态转化。
当然如果不知道确定类型的话,更为安全的用法当然是动态转化!
三,杂七杂八;
1,new和delete的配对使用。
其中的配对使用不仅仅说明了有多少个new操作就必须做多少个delete操作;这个对于先学习java语言或者是c#语言而后来学C++语言的人是特别要
注意的!
千万不能忘记delete。否则memory leak就会不知不觉的发生!
2,其次new和delete的形式必须相同!
也就是说new的是个指针指向的是单一对象还是[]指向数组;
那么delete也必须相对应的delete相应的内容!(加还是不加[])
1,在定义一个类的时候,如果程序员没有显示的定义一下几个东西的话,编译器会自动为你生成以下的几个成员;
1)缺省构造函数.(无参)
2)拷贝构造函数
3)赋值运算符.
4)取地址运算。
5)析构函数
也就是说你定义一个class Empty(){};
跟你定义一个
class Empty{
public:
Empty(); // 缺省构造函数
Empty(const Empty& rhs); // 拷贝构造函数
~Empty(); // 析构函数 ---- 是否
// 为虚函数看下文说明
Empty&
operator=(const Empty& rhs); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const;
};
是一样的。
2,这样也就决定了几个问题:
1)在继承的过程中,构造函数,析构函数,赋值运算符,拷贝构造函数不会被继承。
2)如果在派生类中没有显示的定义,编译器会为你做初始的定义!
二,类层次中的向上向下类型转化;
1,层次中对指针或者是引用进行类型的向上转化是安全的也不需要显示的转化,这也是虚函数实现动态的一个方法!
2,层次中如果使用对象来直接进行类型的向上转化的话,那么将会发生"对象切片"的问题。
也就是说最后转化后的对象只保留上一个层次中所能拥有的接口!
3,层次中向下类型转化,是不确定也不是安全的。也是需要显示才能作出转化的。通常的话有两种转化方式,一种是
dynamic_cast<Derived*>(base*);
另外一种是静态的转化: static_cast<Derived* >(base*);
显然静态的转化所需要的空间以及系统资源较少,但是动态的较多;
所以在可以确定转化的类型的时候,可以配合RTTI(run-time-type-information)来使用静态转化。
当然如果不知道确定类型的话,更为安全的用法当然是动态转化!
三,杂七杂八;
1,new和delete的配对使用。
其中的配对使用不仅仅说明了有多少个new操作就必须做多少个delete操作;这个对于先学习java语言或者是c#语言而后来学C++语言的人是特别要
注意的!
千万不能忘记delete。否则memory leak就会不知不觉的发生!
2,其次new和delete的形式必须相同!
也就是说new的是个指针指向的是单一对象还是[]指向数组;
那么delete也必须相对应的delete相应的内容!(加还是不加[])