1.explicit
在C++中,如果一个类定义了只接受一个参数的构造函数(并且这个参数类型不是该类的指针和引用),就可以实现从形参类型到这个类类型的隐式转换(这里加一个链接),但是有时候这种隐式的转换并不是我们希望的,通过在类内部的构造函数声明之前加上explicit关键字,编译器在编译时候就不会进行隐式的转换了。
2.mutable
类的mutable成员永远不能是const的,它的值即使在const成员函数中也可以被修改,好惨的样子。。。
3.Protected
Protected成员的访问权限刚开始学习会觉得有点疑惑。用Protected关键字修饰的成员可以被以三种形式进行访问:
a).它自己类定义内部的所有成员函数。
b).可以被它的友元函数或者友元类访问(这句话的意思见注解1)。
c).在他的继承类的内部函数定义中,通过该类的对象进行访问。
注解1:被友元函数访问是指在友元函数的形参中如果有一个是指向该类对象的引用或者指针,那么在这个友元函数内部就可以通过这个引用或者指针访问到该对象的任何成员。而当这种有元函数出现在一个类中的时候,那么指的就是可以通过有元类访问该类的任何成员。下面举例说明:
eg.
class Base_class
{
public:
bool set_para(double my_price,string & my_name)
{
price=my_price;
name=my_name;
return true;
}
protected:
double price;
private:
string name;
};
class Offspring_class:public Base_class
{
public:
double set_price(const Offspring_class& of_class,const Base_class& base_class)
{
double temp_price=price;//ok
temp_price=of_class.price;//ok
temp_price=base_class.price;//errorXXXXXXXXXXX!!!!!!!!
string my_name=name;//error private member of base class is not accessable in the derived class
}
};
int main()
{
string name("Brilliant_nut");
Base_class base_c;
base_c.set_para(10,name);//ok
base_c.price;//error
Offspring_class of_c,
of_c1;
of_c.set_price(of_c1,base_c);//ok
of_c.price;//errorXXXXXXXXXXX!!!!!!!!
return 0;
}
4.export
在进行C++项目的代码编写时,将类的定义,函数的声明写在头文件中,而函数的定义写在对应的源文件中是很好的变成习惯。但是当我们使用模板类进行编程的时候,由于编译器在编译模板函数的时候需要知道模板函数的定义,因此需要将包含模板函数定义的文件也include到使用它的文件中,因此在每编译一个include了这个模板函数定义的文件就会产生该函数的一个实例。这样一来就出现了实例化的冗余,在大型程序中就会影响到编译的效率。为了消除这种冗余就可以用到export这个关键字。在包含模板函数定义的源文件中(注意不是进行声明的头文件)每个模板函数声明之前添加export关键字,它会让编译器记住给定的模板已经被实例化。这样每一个模板函数就只会被实例化一次了。