《C++编程思想》笔记

《C++编程思想》笔记

  • 第3章:C++中C
  • 第4章:数据抽象
  • 第5章:隐藏实现
  • 第6章:初始化与清除
  • 第7章:函数重载与默认参数
  • 第8章:常量
  • 第9章:内联函数
  • 第10章:名字控制
  • 第13章:动态对象创建
  • 第14章:组合和继承
  • 第15章:多态性和虚函数
  • 第16章:模板介绍

第3章:C++中C

  1. 标准C和C++有一种特征叫做函数原型。用函数原型,在声明和定义一个函数时,必须使用参数类型描述。这种描述就是“原型”。调用函数时,编译器使用原型确保正确传递参数并且正确处理返回值。

  2. 在C++中,函数定义的参数表中可以使用未命名的参数。如果有一个空的参数列表,可以在C++中声明这个函数为func(),它告诉编译器,这里有0个参数。应该意识到这只意味着在C++中是空参数列表。在C中,它意味着不确定的参数数目(这是C中的漏洞,因为在这种情况下不能进行参数检查)。在C和C++中,声明func(void)都意味着空的参数列表。

  3. C++函数原型必须指明函数的返回类型,在C中,如果省略返回值,表示默认为整型。

  4. const声明的常量,通常不分配存储空间,只在编译期间放在符号表中,在运行时,这个符号表是不存在的。

  5. 对于虚函数表放在.rodata,那么虚函数表中的内容是否可变的问题,有这么一种理解,但是还需要论证:虽然虚函数表中发的指针是不可变的,但是指针所指向的内容是可变的,就像int * const p;一样。

  6. 有一种说法:int a是定义,extern int a是声明

  7. 为什么要使用指针?

    • 为了能在函数内改变“外部对象”
    • 为了获得许多灵活的编程技巧
  8. 引用和指针的不同之处在于,带引用的函数调用比带指针的函数调用在语法构成上更清晰

  9. C强制在作用域的开始处就定义所有的变量,一遍编译器创建一个块时,能给所有这些变量分配空间;C++允许在作用域内的任何地方定义变量,所以可以在正好使用它之前定义。

  10. 在C中,编译器对待const如同变量一样,只不过带有一个特殊的标记,意思是“不要改变我”。当在C中定义const时,编译器为它创建存储空间,所以如果两个不同的文件中定义多个同名const时,连接器将生成发生冲突的错误消息。

  11. static_cast:包含的转化类型包括典型的非强制变换、窄化变换,使用void*的强制变换、隐式类型变换和类层次的静态定位;const_cast:从const转化为非const或从volatile转化为非volatile;reinterpret_cast:重新解释类型,这通常是一种不明智、不方便的编程方式。

  12. sizeof是一个运算符,不是函数。如果把它应用于一个类型,必须将这个类型放在括号里,如果是对一个变量使用它,可以不用括号。

  13. typedef用“别名”来描述更为准确。在C中使用struct时,typedef是特别重要的。

  14. int main(int argc, char* argv[])int main(int argc, char** argv)一样。第一个参数的值是第二个参数的数组元素个数,argv[0]是程序本身的路径和名字。

  15. enum枚举中,如果对某些名字赋值,对其他的不赋值,编译器会使用相邻的下一个整数值。

第4章:数据抽象

这一章主要讲数据的封装发展。

  1. delete对应new,数组new对应数组delete。

  2. 当编译时,如果在栈上创建一个变量,那么这个变量的存储单元由编译器自动开辟和释放。编译器准确的知道需要多少存储容量,根据这个变量的活动范围知道这个变量的生命周期。而对动态内存分配,编译器不知道需要多少存储单元,不知道他的生命周期,不能自动清除。

  3. 在C语言中,可以使用没有声明的函数。因为,C语言会配置默认的搜索路径,*.c,全局查找。

  4. 每个独立的C文件是一个翻译单元。

  5. 在C中,可以将任意类型的指针赋值给void*,也可以将void*赋值给任意类型的指针;在C++中,只允许将任意类型的指针赋值给void*,不允许将void*赋值给任意类型。

  6. 对象就是变量,他的最纯正的定义是“一块存储区”,在这里面能存放数据,而且还隐含着对这些数据进行的操作。

  7. 一个结构体的大小存在内存对齐的情况,目的是提高执行效率。

  8. 对于编写头文件的一点原则:只限于声明,即只限于对编译器的信息,不涉及通过生成代码或创建变量而分配存储的任何信息。

  9. 头文件多次被include,从而出现多次声明,解决方法是防卫式声明,即#ifndef #define #endif

  10. 编译器默认选择的名字(选择最接近的)可能不是我们想要的名字,作用域解析运算法::可以避免这种情况,例如要查找全局的a变量,使用::a

第5章:隐藏实现

这一章主要讲类的访问控制。

  1. 访问控制中的protected值得说一下:子类可访问,但是对象不能访问。

  2. 友元:不管是函数还是类,在一个类中声明为友元,那么这个友元函数或者类就能访问这个类的私有成员,并且友元类或者函数不属于这个类。

  3. 在一个特定的“访问块”内,变量在内存中肯定是连续存放的,但是这些访问块本身可以不按声明的顺序在对象中出现。

  4. 访问控制信息通常在编译期间消失。

  5. 在编程环境中,当一个文件被修改,或它所以来的头文件被修改时,项目管理员需要重新编译该文件。(易碎的基类问题)解决这个问题的技术有时称为句柄类,具体做法是:在一个类的头文件中声

你可能感兴趣的:(C++面试题汇总,书籍,课程笔记,c++,开发语言,mfc)