c++笔记

1.using namespace std 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念

2. g++  a.cpp 生成a.out 可以直接 ./a.out执行

3.三字符表

三字符组替换
??=#
??/\
??’^
??([
??)]
??!|
??<{
??>}
??-~

3.1 const

  • const只修改它右边的类型值
  • const必须在&左边才是常引用
  • const引用指向不同类型会生成一个临时变量,也就是达到了常量的作用了,

 

4.explicit构造函数是用来防止隐式转换的

5.std命名空间, 假设你不使用预处理 using namespace std;就要加上 std::String . 如果加上了using namespace std,可以直接String

5.0 cin

5.1 extern “C” 告诉编译器用C语言的方式查找编译,如下

因为c c++最后生成的函数名称并一致,所有要指定用哪种语言去编译。 __cplusplus是在C++中使用,在C的.c中如果不加,是不知道extern “C”这玩意

如果调用Chead 每次都extern太麻烦(如下)

6.lambda  ([=]:是将外部所有的变量 copy一份, [&]: 引用外部变量 同一地址)

  • []:默认不捕获任何变量;
  • [=]:默认以值捕获所有变量;
  • [&]:默认以引用捕获所有变量;
  • [x]:仅以值捕获x,其它变量不捕获;
  • [&x]:仅以引用捕获x,其它变量不捕获;
  • [=, &x]:默认以值捕获所有变量,但是x是例外,通过引用捕获;
  • [&, x]:默认以引用捕获所有变量,但是x是例外,通过值捕获;
  • [this]:通过引用捕获当前对象(其实是复制指针);
  • [*this]:通过传值方式捕获当前对象;

捕获this

6.1 默认参数

7.随机数

8.setw格式化输出(空格)

9.strcmp代码实现

10.引用

  • 定义时必须初始化,一旦指向了一个变量,就不可在改 (指针的话 是可以改的。引用和指针的区别)
  • 可以初始化一个引用引用另一个引用,只是一个别名
  • 不存在引用的引用,不存在引用的指针,不存引用数组(数组里放多个引用是不存在的)

引用和指针的区别?

  1. 引用初始化就一个指向后不可改
  2. 数组不存在放引用
  3. 可作为函数返回值为引用去修改函数内返回值(局部函数变量没有意义)

数组引用:

 

10.1 重复引用问题,如多次#include

  • #ifndef #define #endif受C\C++支持,不收编译器限制
  • #pragma once (老编译器不支持)
  • #ifndef #define #endif可以对部分代码, #pragma once对整个文件

11. struck

12.函数

  • :: 叫作用域区分符,指明一个函数属于哪个类或一个数据属于哪个类。
  • :: 可以不跟类名,表示全局数据或全局函数(即非成员函数)

*构造函数:

构造函数调构造函数必须 构造函数1:构造函数2

12.1 虚函数 (实现多态 )

父类用virtual声明为虚函数,子类重写,如果不重写调用父类的函数。这时候如果有虚函数,在类的结构体首地址是8字节的虚函数表专门存放虚函数, 如果没有声明虚函数是调用左边编译时的类型, 如果delete stu; 这时候析构函数没有声明虚函数所有调用的是Person析构

13.友元 friend

在一个.h中有些函数指定特定的类可以调用, 其他类不能调用

  • 友元关系不能传递
  • 友元关系是单向的
  • 友元关系不能被继承

14. 内联inline函数

内联能提高函数的执行效率,但是他是在调用的时候copy代码 导致代码量和内存增加,要慎用!

不可用的情况:

  • 函数代码比较长,导致代码过大
  • 函数内循环或者其他复杂的控制结构,那么执行函数体内代码时间比函数调用开销大多,因此内联意义不大

编译器一般选择短小而简单的函数来内联

现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。

目的是为了解决程序中函数调用的效率问题,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,并不是说声明了内联就会内联,声明内联只是一个建议而已。

15.static

16.copy构造函数

Line line(9);
Line linea = line; 这一步会调用copy构造函数

17.inline

内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代(空间换时间)。

  • 在内联函数内不允许使用循环语句和开关语句
  • 在使用前定义
  • 类中内部定义的函数是内联函数(有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联.)

定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.

优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.

缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快

何时使用:1.代码量小  2.调用频率高  其中有些函数声明inline也不一定是内联,如递归

17.1 inline和#define区别?

  1. inline具有语法检测
  2. 函数特性。如果int a=10; 在#define sum(a,b)  (a)  + (b)中调sum(a++)会成  a++ + a++ 就有问题了

18.static

静态变量

静态函数

19.继承

19.1 struct和class区别?

  • struct默认变量是public, class 变量默认是private

20.重载

双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)
关系运算符==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
逻辑运算符||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符+ (正),-(负),*(指针),&(取地址)
自增自减运算符++(自增),–(自减)
位运算符| (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放new, delete, new[ ] , delete[]
其他运算符()(函数调用),->(成员访问),,(逗号),[](下标)

不可重载的运算符列表:

  • .:成员访问运算符
  • .*, ->*:成员指针访问运算符
  • :::域运算符
  • sizeof:长度运算符
  • ?::条件运算符
  • #: 预处理符号

21.三维数组创建和释放

22.数组创建和释放

23.数组的释放

23.1 malloc(5) 可能是上次的数据,所以用memset(p,0,5); 来清空内存上的数据  // 0:全部是0,  5个字节长度全是0

 

23.2 new

24.自定义命名空间

嵌套命名空间

25.泛型

26.预处理宏 #define是替换 gcc -E hello.cpp > hello

 

 


问题:

1.这个指针地址 和fn不一致, ins[] 形参做了什么??

2.2.delete[] arr; 在后面使用会有什么问题? 如何避免?

delete是释放了对一块内存的使用权,但可能被别的使用并修改或者被回收,(释放后arr指针依然存在的,还是指向那个未知内存)如果delete后在使用可能会造成野指针,或者结果改变。 delete后最好把指针指向NULL,不用管那块内存什么情况,在后面使用是判断是否为NULL来处理(delete后不应该再使用了,可能有复杂情况下)(和操作系统也有一定关系,何时回收)

3.如果自由存储区已被用完,可能无法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针(new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。)

4.new  malloc区别?

new是分配内存并创建对象(走默认的构造函数),malloc只是在堆上分内存 要强制转换成对象(不走默认的构造函数)

5.

 

 

发表回复

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud