c++ primer 记录1

目录

  • C++ 记录

    • 不要 混用带符号类型和无符号类型.主要是比较 加减.
    • 右值引用.TODO
    • 数组指针和指针数组
    • const
    • typedef
    • auto
    • decltype TODO

C++ 记录

不要 混用带符号类型和无符号类型.主要是比较 加减.

右值引用.TODO

数组指针和指针数组

a.数组指针: 是指针,指向数组. 如:

// 声明方式. 由于"[]"比"*"优先级要高,所以需要"()"
int (*parr)[5];

// 使用方式
int a[] = {1,2,3,4,5};
parr = &a;

// 打印
auto len = sizeof(a)/sizeof(a[0]);
for(int i = 0;i < len; ++i){
    cout << (*parr)[i] << endl;
}

b.指针数组:是数组,里面存的指针.如:

// a是一个包含10个元素的数组,每个元素都是一个指向int类型的指针.
int* a[10];

const

引用不是一个对象.所以没有指向引用的指针.
如何区分顶层const 和 底层const?
指针如果添加const修饰符,有两种情况:

// 1. 指向int常量的指针
const int *a;

// 2. 指向int的指针常量
int *const b;

情况1叫 常量指针.
被指向的是一个常量,const修饰的是被指向的对象.但是指针本身(a)不是一个常量.可以指向其他变量.

int num = 10;
int val = 20;
const int *a = &num;
// *a = 20;  // 错误. 不能通过 *a 去改变num的值
num = 11;  // 正确
a = &val;  // 正确

情况2叫 指针常量. 指针是一个常量.const修饰的是指针本身.所以指针本身不能改变,但是被指向的对象可以改变.

int num = 10;
int val = 20;
int *const a = &num;
a* = 11; // 正确
// a = &val; // 错误

顶层 const: 对于指针来说,修饰指针本身的const 就是 顶层const,修饰被指向的对象,是底层const.
如:

int * const a;  // const修饰的是指针本身,顶层const
const int *a;  // const修饰的是被指向的对象, 底层const

更一般的,顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型、类、指针等.
底层const则与指针和引用等复合类型的基本类型部分有关.
比较特殊的是,指针类型既可以是顶层const,也可以是底层const,这一点和其他类型相比区别明显.
用于声明引用的 const 都是底层 const.

int i = 0;
int *const pi = &i;  // 顶层 const
const int ci = 42; // 顶层 const
const int *p2 = &i;  // 底层 const
const int &r = ci;  // 用于声明引用的 const 都是底层 const

typedef

typedef char *pstring;
const pstring cstr;  // const修饰的是 指针
不能理解成 const char *cstr;

复杂声明的理解规则: 右左法则
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;
括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。

如:

int (*func[5])(int *);

func是一个包含5个元素的数组,数组元素是 一个以int为返回值,参数为int指针的函数.

auto

a. auto 会忽略掉顶层 const, 保留底层 const;
如:

int num = 10;
const int *a = &num;
auto b = a;
// *b = 111;  错误, b相当于 const int* b;

const int cnum = 11;
auto c = cnum;   // 顶层const被忽略,相当于 int
c = 12;  // 正确

b.如果希望推断出的auto类型是一个顶层const,则需要明确指出:

int num = 10;
const auto p = &num;

int val = 11;
// p = &val;  错误, p中的const是一个顶层const

c. auto &

const int ci = 10;
auto & b = ci;
// b = 11; 错误, b是对ci的引用,就是ci的别名.

decltype TODO

decltype((var)); 双层括号的结果永远是引用.

原文地址:https://www.cnblogs.com/daihanlong/p/10242053.html

时间: 2024-10-28 14:32:37

c++ primer 记录1的相关文章

C++ primer记录

关于C++编程风格,可参考:Google 开源项目风格指南 第一章:开始 头文件:由于嵌套包含文件的原因,一个头文件可能会被多次包含在一个源文件中.条件指示符可防止这种头文件的重复处理,例如:#ifndef BOOKSTORE_H#define BOOKSTORE_H/* Bookstore.h 的内容 */#endif为了保证头文件只被处理一次,把如下#define 指示符#define BOOKSTORE_H放在#ifndef 后面,这样在头文件的内容第一次被处理时,BOOKSTORE_H

C++ primer学习记录(个人猜想未测试版本)

学习版本:第五版. 本博文主要记录个人曾经并不知晓知识细节. 因为linux下的编译环境还未进行学习.所以实际代码测试将在今后完成. 红色:需确认. 蓝色:重点. 1)const对象设定为仅在文件内有效.个人认为:.h .cpp属于同文件的概念(未测试). 2)constexpr:常量表达式标示符.使用此作为前/后缀时,表示此变量/函数为常量表达式.但,具体用途?以及为何需要这样的标示符? 3)但凡使用迭代器的循环,都不要向迭代器增加元素.因为增加元素可能导致容器重新分配内存,导致后续迭代器操作

异步社区《C Primer Plus》勘误记录

记录的内容是在异步社区提交之后被拒绝接受,而我依然认为应当修改的勘误:或者是与编辑沟通体验极不愉快的勘误.且鉴于异步社区勘误无法索引,以此备忘.同时也供大家评判. 1. 页码:229 行数:13 印次:14 勘误截图: 原书内容: (待补) 2. 页码:238 行数:21 印次:14 勘误截图: 接受勘误都要杠一下,也是醉了 原书内容: (待补) 3. 页码:254 行数:5 印次:14 勘误截图: 原书内容: (待补) 4. 页码:271 行数:9 印次:14 勘误截图: 我真的希望大家都能够

《C++ Primer》读书记录五

2015年6月9日  星期二 22:09 第五部分  高级主题 第17章~第18章 第17章 用于大型程序的工具 异常处理,C++的异常处理中,需要由问题检测部分抛出一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信 抛出类类型的异常,异常是通过throw对象而引发raise的.该对象的类型决定应该激活那个处理代码.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位最近的那个.抛出指针通常是个坏主意,抛出指针要求在对于处理代码存在的任意地方存在指针所指向的对

《C++ Primer》读书记录

2015年5月11日 星期一 19:59 第1章 快速入门 第一部分 基本语言 第2章~第8章 第2章 变量和基本类型 基本内置类型,整型(整数,字符和布尔值),浮点型(float,double,long double),有符号/无符号类型 字面值常量 变量,左值和右值 变量名,定义对象,变量初始化规则 声明和定义 名字的作用域 const限定符,只读类型,而不是英文单词常量的意思. 引用,引用和指针的区别? typedef 枚举 类类型 第3章 标准库类型 命名空间的using声明 标准库st

《C++ Primer》读书记录二

第二部分 容器和算法  第9章~第11章 2015年5月13日  星期三 第9章 顺序容器 sequential contai顺序容器的定义 vector<string> svec; list<int> ilist; deque<double> ddeq; 容器元素的初始化,将一个容器初始化为另一个容器的副本,初始化为一段元素的副本,分配和初始化指定数目的元素 容器内元素的类型约束:元素必须支持赋值运算,元素类型的对象必须可以赋值.事实上,除了输入输出标注库类型外,其他

《C++ Primer》读书记录四

第四部分  面向对象编程与泛型编程 第15章~16章 2015年5月18日  星期五  9:19 第15章 面向对象编程 面向对象编程:概述 面向对象编程基于三个基本概念:数据抽象,继承和动态绑定.在C++中,用类进行数据抽象,用类派生从一个类继承另一个类,派生类继承基类的成员.动态绑定使编译器能够在运行时觉得使用基类还是派生类中定义的函数 定义基类和派生类 protect成员,不能被类用户访问,但可以被该类的派生类访问 派生类,class classname:access-label base

《C++ Primer》读书记录三

2015年5月14日 星期四  10:37 第三部分 类和数据抽象  第12章~14章 第12章 类 类的定义和声明,数据抽象和封装 隐含的this指针 何时使用this指针,最常见情况:函数返回对调用该函数的对象的引用 返回*this 从const成员函数返回*this mutable,希望类的数据成员(甚至在const成员函数内)可以修改,可以通过将他们声明为mutable来实现 类作用域 构造函数 构造函数可以被重载 实参决定使用哪个构造函数 构造函数自动执行 用于const对象的构造函数

C++ Primer 课后习题9.39 统计单词个数并记录最大单词和最短单词

习题9.39: 已知有如下string对象: string line1 = "We were her pride of 10 she named us:"; string line2 = "Benjamin, Phoenix, the Prodigal"; string line3 = "and perspicacious perspicacious pacific Suzanne"; string sentence = line1 + ' '