• Thinking in C++ 第4,5,6,7章


    一、C++中的对象

    C++中,对象是一种变量,每一个对象都必须有唯一的地址

     

    对于下面的定义:

    1 struct s{};

    这在C语言中是不合法的,C语言中的结构体必须至少包含一个成员;而在C++中它是合法的定义,虽然它没有成员,但是它的大小不为0,因为前面说过在C++中每个对象都有唯一的地址。在vs2008中,它的大小为1 Byte

    二、访问控制

    C++中使用访问说明符(access specifier)来控制对类的访问。

    所有的访问保护是由编译器来检查的,在运行期不做检查。程序运行期间,不存在访问说明符的信息,这时对象只是一个存储区域。

    C++中的访问控制只是为编程人员提供了一种约束,来帮助他们避免一些错误。如果真的想访问那些私有成员,在运行期通过指针是可以做到的。

    三、带有构造函数的结构体的初始化

    无论是struct还是class,如果它们带有构造函数,则它们的初始化必须通过构造函数进行。如下所示:

     1 struct S{
     2     int i;
     3     S(){}
     4 };
     5  
     6 int main(){
     7     S s = {1}; // Error,带有构造函数,只能通过构造函数初始化。
     8     S s1; //Correct
     9     return 0;
    10 }

    四、函数重载

    名字修饰(name decoration)

    为了实现函数重载,编译器使用不同的参数类型来修饰不同的函数名。例如:

    1 void print(char);
    2 void print(float);

    它们在编译器内部的名字可能会是:_print_char_print_float

    但是,要注意的是,编译器对于名字修饰没有统一的标准,所以不同的编译器可能产生不同的内部名。因此如果在一个编译器上使用另一个编译器编译好的库(dll),可能会出现错误。

    为什么不能使用返回值进行重载

    函数只能通过参数进行重载,而不能通过返回值进行重载,请看下面的情况:

       1 int f();
       2 void f();

    在程序中调用:f();

    这样做,编译器无法判断f()的返回值到底是int 还是 void,因此会产生歧义。

    五、联合的几个要点

    C++中,联合如同结构体一样,可以具有构造函数,析构函数,成员函数还有访问控制。

    它和struct的不同之处在于存储数据的方式。对于union的使用还有一个限制——不能使用union作为基类。

    匿名联合(anonymous union)

    如果一个联合没有类型名和标识符,那么这个联合被称为匿名联合。匿名联合在第一次出现时创建空间,示例如下:

     1 int main(){
     2     union{
     3         int i;
     4         float f;
     5     };
     6         
     7     i = 12;    // 可以直接访问成员,不需要使用点号
     8     f = 1.22;
     9     return 0;
    10 }

    六、合理的使用默认参数

    默认参数同函数重载一样,为我们提供许多方便,它们都允许我们在不同的场景下使用同一个函数名。默认参数只能放在函数声明中,通常在一个头文件中。

    两条原则

    1. 在设计类时,最重要的问题是类的接口,如果设计的类容易使用和重用,便是一个好的类,其次的问题才是效率问题。

    2. 默认参数是为了使函数更容易使用,特别是当某个函数的许多参数都有特定值时。不能把默认参数作为一个标志决定执行函数的哪一块,这是基本原则

    以后要看的

    1. 内存对齐 默认的内存对齐,程序强制的内存对齐

    2. 通过指针的运算,访问类的私有成员

    3. 句柄类,对类的进一步封装,隐藏私有成员,只暴露公共的接口。

    4. C标准库中的setjmplongjmp

    5. 编译器的名字修饰(name decoration)


  • 相关阅读:
    如何通过Restful API的方式读取SAP Commerce Cloud的Product图片
    Permute Digits
    Browser
    Jamie and Alarm Snooze
    Perfect Squares
    Color the ball
    Stars
    1086. Tree Traversals Again (25)
    1085. Perfect Sequence (25)
    1083. List Grades (25)
  • 原文地址:https://www.cnblogs.com/hdtianfu/p/2293711.html
Copyright © 2020-2023  润新知