C++ 特殊机制收集

来源:互联网 发布:老电视能看网络电视吗 编辑:程序博客网 时间:2024/05/17 02:29

类型转换
reinterpret_cast 将一个类型指针转换为另一个类型指针
const_cast    用于去除指针变量的常属性,将它转换为一个对应指针类型的普通变量,反过来也可以将一个非常量指针转换为一个常量指针变量
static_cast    用于转换基本类型和具有继承关系的类新之间转换,不太用于指针类型的之间的转换
dynamic_cast    只能在继承类对象的指针之间或引用之间进行类型转换 



命名空间
命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个集团的声明放在同一个命名空间中。
原来C++标识符的作用域分成三级:代码块({……},如复合语句和函数体)、类和全局。现在,在其中的类和全局之间,标准C++又添加了命名空间这一个作用域级别。

命名空间可以是全局的,也可以位于另一个命名空间之中,但是不能位于类和代码块中。所以,在命名空间中声明的名称(标识符),默认具有外部链接特性(除非它引用了常量)。
在所有命名空间之外,还存在一个全局命名空间,它对应于文件级的声明域。因此,在命名空间机制中,原来的全局变量,现在被认为位于全局命名空间中。
标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构、类和函数等)都被定义在命名空间std(standard标准)中了。

  定义命名空间
有两种形式的命名空间——有名的和无名的。

命名空间的定义格式为:(取自C++标准文档)

       named-namespace-definition:
       namespace identifier { namespace-body }
       unnamed-namespace-definition:
       namespace { namespace-body }
       namespace-body:
       declaration-seqopt

即:
有名的命名空间:
       namespace 命名空间名 {
              声明序列可选
       }

无名的命名空间:
       namespace {
              声明序列可选
       }

命名空间的成员,是在命名空间定义中的花括号内声明了的名称。可以在命名空间的定义内,定义命名空间的成员(内部定义)。也可以只在命名空间的定义内声明成员,而在命名空间的定义之外,定义命名空间的成员(外部定义)。

命名空间成员的外部定义的格式为:
命名空间名::成员名 ……

例如:
// out.h
namespace Outer { // 命名空间Outer的定义
       int i; // 命名空间Outer的成员i的内部定义
       namespace Inner { // 子命名空间Inner的内部定义
              void f() { i++; } // 命名空间Inner的成员f()的内部定义,其中的i为Outer::i
              int i;
              void g() { i++; } // 命名空间Inner的成员g()的内部定义,其中的i为Inner::i
              void h(); // 命名空间Inner的成员h()的声明
       }

       void f(); // 命名空间Outer的成员f()的声明
       // namespace Inner2; // 错误,不能声明子命名空间
}

void Outer::f() {i--;} // 命名空间Outer的成员f()的外部定义
void Outer::Inner::h() {i--;} // 命名空间Inner的成员h()的外部定义
// namespace Outer::Inner2 {/*……*/} // 错误,不能在外部定义子命名空间

注意:
不能在命名空间的定义中声明(另一个嵌套的)子命名空间,只能在命名空间的定义中定义子命名空间。
也不能直接使用“命名空间名::成员名 ……”定义方式,为命名空间添加新成员,而必须先在命名空间的定义中添加新成员的声明。
另外,命名空间是开放的,即可以随时把新的成员名称加入到已有的命名空间之中去。方法是,多次声明和定义同一命名空间,每次添加自己的新成员和名称。例如:
namespace A {
       int i;
       void f();
} // 现在A有成员i和f()

namespace A {
       int j;
       void g();
} // 现在A有成员i、f()、j和g()

还可以用多种方法,来组合现有的命名空间,让它们为我所用。例如:
namespace My_lib {
       using namespace His_string;
       using namespace Her_vector;
       using Your_list::List;
       void my_f(String &, List &);
}

使用:
using namespace My_lib;




内联函数inline

1,内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。
2,  在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
3, 内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话将会获得比较好的效率.
4, 内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。

  内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。




友元

一个类的友元类可以访问该类的私有变量
1.友元可以是一个普通函数,一个类的成员函数,或者是一个类
2.一个类的成员函数作为另一个类的友元函数时,必须先定义这个类。
3.友元关系是单向的,不具有交换性.若类A是类B了的友元,并不代表类B是类A的友元.友元关系也不具有传递性.
4.友元函数的作用:1.提高了程序的运行效率.2.实现类之间的数据共享
5.缺点:破坏了数据的隐蔽性和封装性.

友元能够使得普通函数直接访问类的私有数据,避免了类成员函数的频繁调用。类的友元函数不是类的成员函数,它在类的范围之外定义,但可以访问该类的所有成员函数,包括私有成员。用关键字friend。友元函数的定义可以在类的内部,也可以在类的外部。友元函数虽然可以访问类的私有成员,但它不是类的成员函数,也不能直接引用当前类的成员。
一个类的成员函数也可以声明为另一个类的友元,该函数作为成员函数不仅可以访问自己所在类的所有成员,还可以作为友元函数访问另一个类的所有成员。不仅可以把一个函数声明成一个类的友元,一个类也可以声明为另一个类的友元。友元类中的所有成员函数可以访问另一个类的私有成员。友元关系是单向的,不具有交换性,友元关系不具有传递性。


运算符重载

运算符重载的函数名是由关键字operator和要重载的运算符组成。其形式:
      返回类型 operator 运算符号 (参数列表)

原创粉丝点击