Featured image of post C++ Primer Plus读书笔记

C++ Primer Plus读书笔记

责而反复,润物无常,时然苍苍,如日中升

开学了,有C++面向对象编程课程,然觉学校教材并不足合胃口,遂循🚀意见,阅此经典。略记些许笔记,加深印象(记性不好)只记我没学过的

第一章 预备知识

问题不多,详细请自己阅读

第二章 开始学习C++

类介绍

类时用户定义的数据类型,要定义类,需要描述如何表示信息和可对数据执行哪些操作
类之于对象就像
类型之于变量
类描述一种数据类型的全部属性
对象是类的实例化

第三章 处理数据

内置的c++类型对象有基本类型和复合类型,当然程序还需要一种表示存储数据的方法

简单变量

程序要记录三个基本属性

  • 信息将存储在哪里
  • 要存储什么值
  • 存储何种类型的信息
1
2
int counts;
counts=5;

这些语句告诉程序,它正在存储整数,程序也将找到一块内存用于存储,并将单元标记为counts。
实际上,我们可以用&来检索其在内存中的位置

变量和变量名

命名方式类似于c,注意一下

  • 只能字母字符、数字和下划线
  • 名称第一个字符不是数字
  • 区分大小写
  • 无C++关键字
  • 以两个下划线或下划线和大写字母打头的名称被保留用于实现,以一个下划线开头的名称将被用作全局辨识符
  • 名称长度无限制

整型

short/int/long

计算机内存由bit单元组成,c++确保最小长度

  • short至少16位
  • int至少与short一样长
  • long至少32位,且至少与int一样长

位与字节

位(bit)可看作电子开关的,0表示关,1表示开,8位内存块便有256种组合了,每增加一位可以增加一倍组合数
字节(byte)通常是八位内存单元,字节指的是描述计算机内存量的度量单位
我们也可以在头文件climits导入后查看关于整型限制的信息,具体地说它表示的各种限制的符号名称。 例如INT_MAX为int最大取值,CHAR_BIT为字节位数;
size_of操作符我们就可以得到具体的一种类型名的大小

无符号

前面的三种类型都可以通过无符号扩大范围,但前提是无负数要求的情况下

数字类型控制符

dec十进制
hex十六进制
oct八进制
输出是跟在变量后面
例如cout<<"chest = " << " (decimal)" <<endl;

char类型:字符和小证书

char类型专门为存储字符而设计,但是在cin和cout时发生过改变,cin时输入的字符在计算机内转化为数字,cout时则又转化为字符

成员函数cout.put()

cout.put()是同一个重要c++OOP概念——成员函数的第一个例子。例如类ostream有一个put()成员函数,用来输出字符。必须用句点将对象名和函数名称连接起来。句点被称为成员操作符。
而cout.put()的意思就是,通过类对象cout来使用函数put(),提供了另一种显示字符的方法可以替代«操作符,而将字符常量’M’和’N’显示为数字

重要复合类型——指针和自由存储空间

声明和初始化

int* p_new C++程序员多采用这种格式,强调声明一个int指针 我们可以在声明语句中初始化指针,在这种情况下,被初始化的是 指针,而不是它指向的值

1
2
int hi=5;
int* pt=&hi;

指针和数字

指针不是整型,所以我们不能在声明指针,要给指针赋值,要将数字值作为地址来使用,通过强制类型转换将数字变为合适的地址类型

1
2
int* pt;
pt = (int *)0xB8000000;

使用new来分配内存!💘

new可以根据程序的需要分配内存大小,而我们程序员所需要做的,就是告诉new,需要为哪种数据类型分配内存;new会找到一个长度正确的内存块,并返回内存块地址
之后我们要学会释放指针的内存

1
2
3
int* ps=new int;
... #use
delete ps;

使用new创建动态数组!'

1
2
3
int* psome=new int [10];
...
delete []ps;

new操作符返回第一个元素的地址,如果我们要使用,可以直接通过psome[0],如果我们用p3=p3+1,那么p3的零基地址就+1,之后再次使用psome[0]就是原来的psome[1]了

尽可能使用const

将指针参数声明为指向常量数据的指针有两条理由

  • 可以避免由于无意见修改数据导致的编程错误(比如先声明const float gm=1.6,再声明float * pm =&g_m是不可行的
  • 使用const使得函数可以处理const和非const实参,否则将只能接受非const数据,如条件允许,则应将指针形参声明为指向const的指针

函数探幽

内联函数

为提高程序运行速度所做的一项改进,由于编译的最终产品是可执行程序,而 内联函数提供了另一种选择,内联函数的汇编代码与其他代码内联起来了。也就是,编译器将使用函数代码替换调用。
对于内联代码,程序无需跳到另一个位置执行代码又再调回来

而我们要使用这项特性,必须采取下列措施

  • 函数声明前加上关键字inline
  • 函数定义前加上关键字inline
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// inline.cpp -- using an inline function
#include <iostream>

// an inline function definition
inline double square(double x) { return x * x; }
int main()
{
    using namespace std;
    double a, b;
    double c = 13.0;

    a = square(5.0);
    b = square(4.5 + 7.5);   // can pass expressions
    cout << "a = " << a << ", b = " << b << "\n";
    cout << "c = " << c;
    cout << ", c squared = " << square(c++) << "\n";
    cout << "Now c = " << c << "\n";
    // cin.get();
    return 0;  
}

程序输出,内联函数和常规函数一样,也通过值来传递参数,如果函数为表达式,那么也就传递表达式的值,这使得c++内联函数功能十分强大

内联与宏

一个计算平方的宏
#define SQUARE(X)X*X
这并不是通过传递参数实现的,而是通过文本替换实现的,X就是参数的符号标记

1
2
3
a=SQUARE(5.0)is replaced by a =5.0*5.0;
b=SQUARE(4.5+7.5)is replaced by b=4.5+7.5*4.5+7.5;
d=SQUARE(c++):is replaced by b=c++*c++

实际上上述范例只有第一个可以正常工作,可以通过使用括号来进行改进: #define SQUARE(x) ((x)*(x))

引用变量

C++新增一种复合类型——引用变量。
例如,将twin作为element变量的引用,则可以交替使用twin和element来表示该变量。
那么,这种别名有何作用?——用作函数形参,通过引用变量用作参数

1
2
int rats;
cint & rodents = rats;

&不是地址操作符,而是类型标识符的一部分,上面允许rodents和rats互换——它们指向相同的值和内存单元

——注意! 可以通过初始化声明设置引用,但通过赋值设置是不行的

1
2
3
4
5
6
int rats 
int  pt ; 
&rats; 
int & rodents =*pt;
int bunnies = 50;
pt = &bunnies;

rodents初始化指向了rats。接下来pt改为指向bunnies并不能改变引用
在函数中传入引用参数的话,我们就可以真正意义上修改参数的值了

本博客已稳定运行
发表了32篇文章 · 总计7万4千字

浙ICP备2024137952号 『网站统计』

𝓌𝒶𝒾𝓉 𝒻ℴ𝓇 𝒶 𝒹ℯ𝓁𝒾𝓋ℯ𝓇𝒶𝓃𝒸ℯ
使用 Hugo 构建
主题 StackJimmy 设计
⬆️该页面访问量Loading...