用C++编程,一些细节工作中使用不到,也没有考虑过。
有时候,想一想一些细节问题,感觉还真的不能用十分肯定的语气回答。
所以陆续总结了一些C++语言中的小细节。。。。
1.隐藏:
派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
2.inline要和函数体在一起才会被编译为内联函数。
3.构造函数
1)当派生类定义了一个构造函数,不管是有参数还是无参数。基类必须定义无参构造函数。
2)派生类总是调用基类无参构造函数。
3)派生类D,可以这样声明对象D ad(10);调用了派生类的参数构造函数和基类的无参构造函数。
但是,当这样声明D ad();时,不会调用基类或派生类的任何构造函数,ad也不是个对象。
4.继承规则
若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。
5.const类成员常量,初始化必须在构造函数的初始化列表中初始化,没给构造函数都要对它进行初始化。
int const *a; //a可变,*a不可变
int *const a; //a不可变,*a可变
6.赋值运算符重载
赋值运算符不像拷贝构造函数,是对一个已经存在的对象赋值。(初始化虽然也有=号,调用的是拷贝构造函数)
所以往往考虑以下情况:
// (1)检查自赋值
if(this == &avg)
return *this;
// (2) 释放原有的内存资源
// (3)分配新的内存资源,并复制内容
// (4)对基类的数据成员重新赋值
Base::operate =(other); // 因为不能直接操作私有数据成员
// (5)对派生类的数据成员赋值
// (6)返回本对象的引用
return *this;
深度赋值要考虑到2,3的情况。
7.仿函数
C++一些奇怪的使用往往是从重载运算符开始。
定义类,重载类的()运算符,为类声明对象。这个对象就当作函数来使用。
struct STest
{
void operator()( int i );
}
STest functioner;
functioner(100);
(未完待续)