重学C++ Primer后一些基本知识点注意点总结

别打名名 2015-09-23 02:52:23
对于熟练C或者C++的人来说,熟读和熟记并理解下面的内容是有很大的帮助的,要在实践中好好去体会和实现下面的要点。以此作为笔记,不厌其烦的去理解,好好学习。
- 内置类型的存储空间依机器而定,当规定了每个算术类型的最小存储空间
- 字符串字面值区分宽字符串是以宽空字符结束的
- 使用了未定义行为的程序都是错误的,即时程序能够运行,也只是巧合。(提示:反斜杠)
- 变量的初始化形式包括:复制初始化(等号)和直接初始化(括号),对类类型的对象来说,有些初始化仅能用直接初始化完成。
- 初始化、赋值、定义要理解
- 内置类型变量是否自动初始化取决于变量定义的位置
- 类类型变量的初始化:如果定义某个类的变量时没有提供初始化式,这个类也可以定义初始化时的操作。它是通过定义一个特殊的构造函数即默认构造函数来实现的;
- 有些类类型没有默认构造函数,那就必须提供显示的初始化式
- 在一个程序中,变量有且仅有一个定义
- 定义也是声明
- extern 声明不是定义,也不分配空间;只有当声明也是定义时,声明才可以初始化式,如果声明有初始化式,那么它可被当作是定义,基石声明标记为extern,不过只有当extern 声明位于航速外部时,才可以含有初始化式;
- C++中,大多数作用域是通过用花括号来界定的
- 全局作用域、局部作用域、语句作用域、类作用域、命名空间作用域
- 通常把一个对象定义在它首次使用的地方是一个很好的办法
- const 对象:常量在定义后就不能被修改,所以定义时必须初始化
- 与其他变量不同,除非特别说明,在全局作用域声明的const 变量是定义该对象的文件的局部变量。此变量只存在被定义的那个文件中,不能被其他的文件访问
- 但是通过指定const变量为extern,就可以在整个程序中访问const对象(非const对象默认为extern)
- 引用是一种复合类型,通过在变量名前添加“&”符号来定义。
- 引用只能绑定一次对象;引用不能为数组;
- const 引用是指向const对象的引用;const 引用可以绑定到不同但相关类型的对象或绑定到右值(原因:中间变量);
- 非const引用只能绑定到与该引用同类型的对象;
- 枚举成员值可以不是唯一的,即可以有同样的值
- 不能改变枚举成员的值,枚举成员本身就是一个常量表达式,因此也可以用于需要常量表达式的地方
- 枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行,如枚举变量Week week = Mon;
- 定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化。
- 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private
- struct 定义变量的时候不用像C语言那样要加上struct关键词了
- 编译器把目标文件链接在一起形成可执行文件
- 头文件包含在多个源文件中,所以不应该含有变量或函数定义,区别类中的数据成员的定义
- 当在头文件中定义const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样,相当与没包含一次就定义了同名同值的const变量,且const变量如果不加显示的extern,只能在本文件中使用,所以不会发生重定义错误,不同于普通变量,但是加了extern的话如果多次包含就是出现重定义的错误
- 避免多重包含:预处理变量。使用预处理变量可以防止多次包含同一个头文件。机制就是重包含了,通过预处理变量只对#ifndef后面的内容处理一次

更多的注意可以在我的博客中(帖子里界面显示不怎么美观):http://blog.csdn.net/freeape/article/details/48554011
...全文
389 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
别打名名 2015-09-29
  • 打赏
  • 举报
回复
我又更新了内容,涉及范围更多了,再过半个月就能够整本C++ Primer总结完了。
beMyBest 2015-09-26
  • 打赏
  • 举报
回复
引用 7 楼 fefe82 的回复:
[quote=引用 6 楼 beMyBest 的回复:] [quote=引用 楼主 FreeApe 的回复:] - 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private http://blog.csdn.net/freeape/article/details/48554011
这条不够全面。struct 可以以花括号的形式初始化,但 class 却不行[/quote] 没有这个说法。你说的应该是 aggregate ,aggregate 并不区分 struct 还是 class 。他只要求没有用户定义构造函数,没有对非静态成员的显式初始化,没有保护的或私有的非静态数据成员,没有基类,没有虚函数。[/quote] 验证了一下确实如此,被一篇文章误导了。。。 aggregate 出来结构体,好像不能做 const_cast 转换(程序直接崩溃),这又是何解呢?譬如 struct Test{ Test(int a_, int b_) : a(a_), b(b_) {} int a; int b; }
const Test t = {123, 246};
Test& t2 = const_cast<Test&>(t);
t2.a = 888; <= 这行代码的 t2 运行时说它是野指针!!
但如果下面这么来弄的话就完全没有问题:
const Test t(123, 246);
Test& t2 = const_cast<Test&>(t);
t2.a = 888;
fefe82 2015-09-25
  • 打赏
  • 举报
回复
引用 6 楼 beMyBest 的回复:
[quote=引用 楼主 FreeApe 的回复:] - 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private http://blog.csdn.net/freeape/article/details/48554011
这条不够全面。struct 可以以花括号的形式初始化,但 class 却不行[/quote] 没有这个说法。你说的应该是 aggregate ,aggregate 并不区分 struct 还是 class 。他只要求没有用户定义构造函数,没有对非静态成员的显式初始化,没有保护的或私有的非静态数据成员,没有基类,没有虚函数。
beMyBest 2015-09-25
  • 打赏
  • 举报
回复
引用 楼主 FreeApe 的回复:
- 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private http://blog.csdn.net/freeape/article/details/48554011
这条不够全面。struct 可以以花括号的形式初始化,但 class 却不行
paschen 版主 2015-09-24
  • 打赏
  • 举报
回复
谢谢LZ总结!
赵4老师 2015-09-24
  • 打赏
  • 举报
回复
程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
ztenv 版主 2015-09-24
  • 打赏
  • 举报
回复
边学边总结,好习惯
wanren13 2015-09-24
  • 打赏
  • 举报
回复
谢谢总结,学习了!

64,700

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧