C++ primer 笔记

  • Chapter 2

    • low-level & top-level const
    • constexpr
    • type alias
      • pointer alias
    • decltype
      • decltype 与 引用
  • Chapter 3
      • 多维数组的类型别名
  • Chapter 6 函数
    • 声明一个返回数组指针的函数
    • 函数重载
      • const_cast
    • 函数实参
      • 默认实参
      • 默认实参初始值
  • Chapter 7 类
    • 特性

      • 可变数据成员
      • 返回*this的成员函数
      • 基于const的重载
    • 委托构造函数
  • Chapter 8
    • string流

      • istringstream
      • ostringstream
  • Chapter 9
    • 容器操作

      • emplace
    • 适配器
  • Chapter 10
    • 泛型算法
    • lambda 表达式

Chapter 2

low-level & top-level const

int i = 0;
int *const p1 = &i;         // top-level
const int c1 = 42;          // top-level
const int *p2 = &ci;        // low-level
const int *const p3 = p2;   // low-level (left) & top-level (right)
const int &r = ci;          // both low-level

constexpr

constexpr int mf = 20;

type alias

typedef double wages;       // classic
typedef wages base, *p;

using SI = Sales_item;      // C++11

pointer alias

typedef char *pstring;
const pstring cstr = 0;     // cstr是指向char的常量指针
const pstring *ps;          // ps是一个指针,它的对象是指向char的常量指针

const char *cstr = 0;       // [注意]与 const pstring cstr 不同!

decltype

decltype(f()) sum = x;

decltype 与 引用

decltype(i) e;      // 正确
decltype((i)) d;    // 错误, d 是 int&

Chapter 3

多维数组的类型别名

using int_array = int[4];
typedef int int_array[4];

Chapter 6 函数

声明一个返回数组指针的函数

int (*func(int i))[10];
auto func(int i) -> int(*)[10];    // lamabda

函数重载

const_cast

const string &shorterString(const string&, const string &);

// 使用const_cast重载原函数的非常量版本
string &shorterString(string &s1, string &s2)
{
    auto &r = shorterString(
                const_cast<const string&>(s1),
                const_cast<const string&>(s2));
    return const_cast<string&>(r);
}

函数实参

默认实参

typedef string::size_type sz;
string screen(sz, sz, char = ' ');
string screen(sz, sz, char = '*');      // 错误
string screen(sz = 24, sz = 80, char);  // 正确

默认实参初始值

sz wd = 80;
char def = ' ';
sz ht();
string screen(sz = ht(), sz = wd, char = def);
string window = screen(); // 调用 screen(ht(), 80, ' ');

Chapter 7 类

特性

可变数据成员

关键字 mutable

返回*this的成员函数

返回*this表示将对象作为左值返回,意味着可以将一系列操作连接在一条表达式中

myScreen.move(4, 0).set('#');

基于const的重载

class Screen {
public:
    Screen &display(std::ostream &os) {
        do_display(os); return *this;
    }
    const Screen &display(std::ostream &os) const {
        do_display(os); return *this;
    }
}

Screen myScreen(5, 3);
const Screen blank(5, 3);
myScreen.set('#').display(cout);    // 非常量版本
blank.display(cout);                // 常量版本

委托构造函数

一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程

Chapter 8

string流

istringstream

istringstream record(line);
record >> info.name;

ostringstream

ostringstream formatted;
formatted << anyString << endl;
cout << formatted.str();

Chapter 9

容器操作

emplace

以下等价

c.emplace_back(args);
c.push_back(T(args));

适配器

stack<int, vector<int>>stk; // 使用vector构造stack适配器

Chapter 10

泛型算法

  • back_inserter插入迭代器
  • for_each

lambda 表达式

  • 值捕获
  • 引用捕获
  • 隐式捕获
时间: 2024-10-12 13:05:15

C++ primer 笔记的相关文章

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

C++ Primer笔记2_四种类型转换_异常机制

1.类型转换 命名的强制类型转换: 有static_cast.dynamic_cast.const_cast.reinterpret_cast static_cast: 编译器隐式执行的任何类型转换都可以由static_cast完成 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换. 可以将void*指针转换为某一类型的指针 可以将基类指针强制转换为派生类指针,但是不安全. 无法将const转化为nonconst,这个只有const_cast才可以办得到 举例:

重读C++ Primer笔记

C++ Primer 5E 有符号和无符号 无符号类型和有符号类型混合运算时,有符号数会被提升至无符号类型,如果其值为负责会产生错误. int main() { unsigned int u = 10; int i = -42; std::cout<<u+i<< std::endl; // 4294967264 if sizeof(int)==4 return 0; } 列表初始化 列表初始化过程不允许损失数据类型精度,所以下面代码中的两行无法通过编译 int main() { d

C++ Primer笔记6_STL之泛型算法

1.泛型算法: 大多数算法定义在头文件algorithm中,标准库还在头文件numeric中定义了一组数值泛型算法 只读算法: 举例: find函数用于找出容器中一个特定的值,有三个参数 int val = 10;//val为我们需要查找的值 auto result = find(vec.begin(), vec.end(), val): cout << "The value "<< val << (result == vec.end() ? &qu

C++ Primer笔记13_运算符重载_总结

总结: 1.不能重载的运算符: . 和 .* 和 ?: 和 ::  和 sizeof 和 typeid 2.重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则如下: 运算符 建议使用 所有一元运算符 成员函数 = () [] -> 必须是成员函数 += -= /= *= ^= &= != %= >>= <<= , 似乎带等号的都在这里了. 成员函数 所有其它二元运算符, 例如: –,+,*,/ 友元函数 3.前几篇中的实例,现在汇总Person类的程序:

C++ Primer笔记4_类的静态成员_IO库

1.类的静态成员 static成员变量与函数 static成员变量:必须在类外初始化:(const或引用类型变量必须在构造函数初始化列表里初始化) static成员函数: 不依赖于类,相当于类里的全局函数(可以由该类对象调用,也可以 类名::函数名()的形式调用) 不包含this指针,不能声明为const,声明为const表示不会改变对象,而static成员函数存在于任何对象之外. 相当于把访问范围限制在所在的类中!  注意:不能访问类中非static成员变量以及非static成员函数. 注意:

C++ Primer笔记3_默认实参_类初探_名字查找与类的作用域

1.默认函数实参 在C++中,可以为参数指定默认值,C语言是不支持默认参数的,Java也不支持! 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数赋值.这就是默认参数: (2)在函数调用时,省略部分或全部参数.这时可以用默认参数来代替. 注意事项: (1)函数默认值只能赋值一次,或者是在声明中,或者是在定义中,都可以. (2)默认参数定义的顺序为自右到左.即如果一个参数设定了缺省值时,其右边的参数都要有缺省值.比如int f(int a, int b=1,int c=2,int d=

C++ Primer笔记7_STL之关联容器

关联容器 与顺序容器不同,关联容器的元素是按关键字来访问和保存的.而顺序容器中的元素是按他们在容器中的位置来顺序保存的. 关联容器最常见的是map.set.multimap.multiset map的元素以键-值[key-value]对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据. set仅包含一个键,并有效的支持关于某个键是否存在的查询. pair类型 首先介绍下pair,pair定义在utility头文件中,一个pair保存两个数据成员,类似容器,pair是一个用来生

C++ Primer 笔记 第三章

C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 默认构造函数,s1为空串 string s2(s1) 将s2初始化为s1的一个副本 string s3(“value”) 将s3初始化为一个字符串的副本 string s4(n, 'c') 将s4初始化为字符'c'的n个副本 getline读取整行文本 getline接受两个参数:一个是输入流对象和