我是靠谱客的博主 粗暴小猫咪,最近开发中收集的这篇文章主要介绍c++primer中文版(第五版)学习札记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 如果给变量加上了一层或者多层括号,编译器就会把他当作一个表达式变量是一种可以作为赋值语句左值的表的表达式,这样的deceltytpe会得到引用类型
  • c++11新标准规定可以为数据成员提供一个类内初始值,没有初始值的成员将会被默认初始化
  • 为了确保各个文件中的类的定义一致,类通常被定义到头文件中,而且类所在的头文件名应与类名一致
  • 确保头文件多次包含仍能正确工作的技术是预处理器,#define把一个名字设定为预处理变量,#ifdefi当且仅当变量以定义时为真,#ifndef当且仅当变量未定义时威为真,一旦检查结果为真,则执行后续操作直到遇到#endif(用于结束一个#ifdef或#ifndef)时为止
  • 局部作用域的对象未被初始化,即拥未定义的值
  • 空指针是值为0的指针
  • 引用是某个对象的别名
  • 分离式编译:把程序分割成多个单独文件的能力
  • void*可以指向任意非常量的指针类型,不能执行解引用操作
    -如果使用等号初始化化一个变量,实际上执行的是拷贝初始化,否则执行直接初始化
  • 在执行读取操作时,string对象会自动忽略开头的空白,并从第一个真正的字符开始读取,直至遇见下一个空白字符为止
  • string类size函数返回一个·string::size_type类型体现了与机器无关的特性,他是一个无符号的数,能够存放下·任何string对象的大小,所以在表达式中不要将有符号和无符号的数相混用, 此时的带符号的负数将转换为一个比较大的无符号数
  • 当两个string对象短的是长的前缀,则说短的小于长的
  • 当把string对象和字符字面值混在一条语句
  • vector对象的下标也是从0开始的下标的类型是size_type类型
  • vector对象以及string对象的下标都只能用于访问已存在的元素而不能用于添加元素
  • 所有标准库容器都都可以使用库容器
  • end迭代器指示的是容器根本不存在的尾后,若容器为空,begin和end返回的是同一个尾后迭代器 ,cbegin,cend函数返回值为const_iterator
  • 点运算符的优先高于*号
  • 数组维度必须是一个常量表达式不能能用一个数组初始化另一个数组,不能把一个数组直接赋值给另一个数组
  • 较大的char类型(wchar_t,char16_t,char32_t)提升成int unsignedint,long,unsigned_long和unsigned long long其中最小的一个类型,前提是转换后的类型要容纳原类型的所有可能值
  • 若一个有符号数和一个无符号数进行运算,无符号数大于或等于有符号数则转化成无符号数。若无符号数小于有符号数,若有符号数能包括无符号数则转换为有符号数,否则转换为无符号数。
  • 在大多数用到数组的表达式中,数组自动转为指向数组首元素的指针,但当用作decltype,&,sizeof,typedef时不会发生上述转换。
  • 0,nullptr能够转为任意类型指针,指向任意非常量的指针能转换为void*,指向任意对象的指针能够转换为const void*
  • 指向非常量类型的指针能够转换为相应的常量类型的指针
    相反的转换并不存在因为它试图删掉一个底层const
  • 命名的强制类型转换:cast_name< type >(expressson);
    static_cast:任何具有明确定义的类型转换,只要不包含底层const,都以使用,用来告知编译器不在乎潜在的精度损失
    const_cast只能改变底运算对象底层const如果对象本身不是一个常量使用此强制类型转换是合法行为,若对象是一个常量则是未定义行为。
    reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。c语言风格的强制类型转换若替换后不合法,相当于此操作。
  • 规定不允许跨过变量的初始化语句而直接跳转到该变量作用域的其他位置,且一个case只能对应一个值
  • 定义在while条件部分或者while循环体内的变量每次都要经过从创建到销毁的过程
  • 有多于一个的函数可以匹配,但是每一个都不是明显的最佳选择,出现二义性调用,发生错误
  • 一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层的作用域中的同名实体
  • 一旦某个形参被赋予了默认值,则他后面的所有形参都必须有默认值
  • 默认实参负责填补函数调用缺少的尾部实参
  • 函数指针指向函数而不是对象,声明函数指针只需用指针替换函数名即可
  • 当把函数名作为值时,该函数自动转化为指针,可以直接使用函数的指针而不需要提前解引用,执行不同函数类型的指针不存在转换过程。
    decltype返回函数类型,此时不会将函数类型转换为指针类型
  • assert是一个预处理宏,作用于一条表示条件的表达式,当未定义预处理变量NDEBUG时,assert对条件求值,否则直接输出错误信息并终止当前程序的执行
  • 定义在类内部的的函数是隐式的inline函数
  • 成员函数通过名为this的额外隐式参数来访问调用它的那个对象
  • this形参是隐式的,任何自定义名为this的参数或变量的行为都是非法的
  • 紧跟在参数列表后的const表示this是一个指向常量的指针,称为常量成员函数,常量对象以及常量对象的指针和引用都只能调用常量成员函数
  • 每个类定义了唯一的类型,即使两个类的的成员列表完全一致,他们也是不同的类型,可以把类名跟在struct或class后
  • 仅声明类而不定义它是一个不完全类型,可以定义指向这种类型的指针或者引用,也可以声明以不完全类型作为参数或者返回类型的函数
  • 类可以把其他的类或者其成员函数(必须指明其所在的类)定义成友元。可以定义在类的内部,这样的函数是内联的。友元类的成员函数可以访问包括非公有成员在内的所有成员,友元关系不存在传递性
  • 如果一个类想把一组重载的函数声明为友元,需要对这组函数中的每一个分别声明。
  • 即使仅仅用声明友元的类的成员调用该友元函数,他也必须是被声明过的。
  • 编译器处理完类中的全部声明才会处理成员函数的定义。
  • 声明中使用的名字,包括返回类型或者参数列表中使用的名字,都必须确保使用前可见,如果耨个成员的声明使用了类中尚未出现的名字,则编译器会在定义该类的作用域中继续查找
  • 类中,如果成员使用了外层作用域中的名字,而该名字代表一种类型,则类不能在之后重新定义该名字
  • 构造函数中如果成员函数是const或者引用的话,必须将其初始化,当成员属于某种类类型且没有默认的构造函数的话,必须将这个成员初始化(初始值列表)。
  • 很多类中初始化直接初始化数据成员,后者则先初始化后再赋值
  • 成员的初始化顺序与他们在类的定义中出现的出现顺序一致,构造函数初始值列表的顺序并不影响实际的初始化顺序,如果一个成员使用另一个成员初始化那么成员初始化的过程就很重要了。
  • 如果一个构造函数为所有的参数都提供了默认的实参,则他实际上也定义了默认的构造函数
  • 当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行.
  • iostream定义了用于读写流的基本类型,fstream定义了命名文件的类型,sstream定义了读写内存的string对象的类型
  • 为了支持使用宽字符的语言,标准库定义了一组类型和对象来操作wchar_t类型的数据
  • 设备类型和字符大小都不会影响我们要执行IO的操作ifstream和istream都继承于istream类,所以其对象的使用与cin一致。同理,ofstream,ostream都继承于ostream类,所以其对象的使用与cout一致。
  • 不能拷贝或对IO对象赋值,因此也不能将形参或返回类型设置为流对象,进行IO操作的函数通过引用的方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回引用不能是const的
  • 一个流一旦发生错误,其上后续的IO操作都会失败,只有当一个流处于无错状态,才可以从他读取数据,向他写入数据,所以使用前要进行检查。
  • badbit表示系统级错误,如不可恢复的读写错误。failbit被置位通常是可修正错误。当到达文件末尾时,failbit和eofbit都会被置位。
  • badbit被置位时,fail也会返回true。good和fail是确定流的总体状态的方法。
  • assign操作不适用于关联容器和array。赋值相关的操作会导致左边的容器内部迭代器,指针和引用失效
  • 可以用assign实现将一个vector中的一段char*赋予list中的string。
    swap函数不进行删除或插入操作,因此可以保证在常数时间之内完成。
  • 除string外,指向容器的迭代器,引用和指针在swap操作之后都不会失效。他们仍指向swap函数操作之前所指向的那元素。swap两个array会真正交换他们的元素,因此交换连个array所需的时间与array中元素的数目成正比。
  • max_size返回一个大于或等于该类型容器所能容纳的最大元素的值。
  • 比较两个容器实际上是进行元素的逐一比较,这些运算符(>,<,>=,<=)的工作方式与string的关系系运算类似。
  • 只有当其元素类型也定义了相应的比较运算符,才可以使用关系运算符来比较两个容器。
  • 向一个vector,string或deque插入元素会使所有指向容器的迭代器,引用和指针失效
  • 向一个vector或string添加元素可能引起整个对象存储空间的重新分配,重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移动到新的空间中去
  • 当用一个对象初始化一个容器或者插入到容器中,实际存放的容器中的是对象的拷贝
  • deque保证在容器首尾进行插入和删除元素的操作都只花费常数时间。
    这里写图片描述这里写图片描述这里写图片描述这里写图片描述

最后

以上就是粗暴小猫咪为你收集整理的c++primer中文版(第五版)学习札记的全部内容,希望文章能够帮你解决c++primer中文版(第五版)学习札记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部