C++八股

C和C++

C++是面向对象的语言,而C是面向过程的结构化编程语言。
C++具有封装、继承和多态三大特性。
C++相比较C,增加了许多类型安全的功能,比如强制类型转换、智能指针。
C++支持泛型编程,比如模板类,函数模板等。

函数后面加default或delete

=defalut使得被修饰的函数为编译器默认的形式。
=delete使得编译器禁止该类型的成员函数生成。

函数后面加const

const只能加在类的非静态成员函数后面。
加了cosnt的成员函数,表示成员函数隐含传入的this指针为const指针,所以在该成员函数中,任意修改它所在的类的成员的操作都是不允许的。
什么时候用——当不改变数据成员的函数都加上cosnt关键字,提高程序的可靠性,保护数据。比如函数为get_a, get_b, get_sum;

由上一段内容,引入了如何用const保护数据?
①常引用:所引用的形参不能被更新。 void display(const double& a);
②常对象:必须被初始化,生存期内不更新。A const a(3,4);
③常成员函数:不能修改对象中数据成员,也不能调用类中没有被const修饰的成员函数(常对象唯一的对外接口)。如果声明了一个常对象,则该对象只能调用它的常函数!另外,可以用于对重载函数的区分。 void func() const;
④extern int a; 使得其他文件也能访问该变量。
关于 extern的用法 详情见extern的用法

程序内存分配方式以及它们的区别

内存分配大致上可以分成5块:
①栈区(stack)。栈,就是那些由编译器在需要时分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。(由编译器管理)
②堆区(heap)。一般由程序员分配、释放,若程序员不释放,程序结束时可能由系统回收。注意,它与数据结构中的堆时两回事,分配方式类似于链表。
③全局区(静态区)(static)。全局变量和静态变量被分配到同一块内存中。程序结束后由系统释放。
④常量存储区。常量字符串就是放在这里的,不允许修改,程序结束后由系统释放。
⑤程序代码区。存放函数体的二进制代码。

全局变量、全局静态变量、静态变量、静态函数

全局静态变量使得该变量成为定义该变量的源文件所独享,即全局静态变量对组成该程序的其他源文件时无效的。
静态变量只被所属源文件使用。
全局静态变量:存放在静态存储区,在整个程序运行期间一直存在。未经初始化的全局静态变量会被自动初始化为0。作用域是从定义之处开始,到文件结尾。
局部静态变量:存放在静态存储区,未经初始化的局部静态变量会被自动初始化为0。作用域是从定义之处开始,到文件结尾。但是当局部静态变量离开作用域后,并没有被销毁,而是仍然驻留在内存当中。
静态函数:静态函数只在声明它的文件当中可见,不能被其他文件所用,不会和其他cpp中的同名函数引起冲突。
类的静态成员:在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会被破坏隐藏的原则,也就是保证了安全性。对多个对象来说,静态数据成员只存储一处,供所有对象共用。
类的静态函数:属于类的静态成员,它们都不是对象成员,对静态成员的引用不需要用对象名。

静态成员函数没有this指针,只能访问静态成员;普通成员函数有this指针,可以访问类中的任意成员。

new delete 与 malloc free的联系与区别

new,delete 和 malloc,free都是释放申请的堆上的空间,都是成对存在的,否则将会造成内存泄漏或者二次释放。不同的是,new delete是C++中定义的操作符,new除了分配空间外,还会调用类的构造函数来完成初始化工作,delete除了释放空间外还会调用类的析构函数。而malloc和free是C语言中定义的函数。

explicit

用于类的构造函数的声明,作用是防止构造函数进行的隐式转换。(如果构造函数接收到参数会默认进行隐式转换)。explicit修饰构造函数,指定这个构造器只能被明确的调用/使用,不能进行隐式转换。
比如 构造函数的参数是int,你构造的时候传入了double参数,就不会触发隐式转换。

mutable

被mutable修饰的变量(mutable只能用于修饰类的非静态数据成员),将永远处于可变的状态(可以修改成员数据之类的)。

define、const、enum

#define不被视为语言的一部分(#define属于预处理器)。对于类似函数的宏,尽量使用内联函数替换掉#define。
:define宏是在预处理阶段展开,define宏没有类型,不做任何类型检查,仅仅是展开,不会分配内存,占用代码段空间,不能进行调试,因为在预编译阶段就已经替换掉了,define没有遇到#undefine之前是没有作用域限制的
:const常量是在编译运行阶段使用,没有具体的类型,在编译阶段会执行类型检查。会在内存中分配(可以是在堆中也可以是在栈中),占用数据段空间,有作用域,可以进行调试。
define只是简单的字符串替换,会导致边界效应,很容易犯错。

#define N 2+3
const double a = N/2; //结果是2+3/2 = 2+1 = 3
const double b = (double)N / (double)2;
//我们预想的答案是2.5,可实际输出的值是2 + 3 / 2 = 3.5

程序编译

程序编译是指将源文件翻译成二进制目标代码的过程。主要是检查语法错误,正确的源程序文件经过编译后在磁盘上生成目标文件。编译产生的目标文件是可重定位的程序模块,不能直接运行。链接则是把目标文件和其他分别进行编译生成的目标程序模块以及系统提供的标准库函数链接在一起,生成可运行的可执行文件

class和struct

都可以定义一个类,但:
1、默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理。
2、成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
一般来说,struct只有成员变量,没有逻辑函数。

指针/数组?

int   *p[4];         //指针数组。  是个有4个元素的数组, 每个元素的是指向整型的指针 。(数组的每个元素都是指针)
int   (*p)[4];       //数组指针。 它是一个指针,指向有4个整型元素的数组。                 (一个指针指向有4个整型元素的数组)
int *func(void);     //指针函数。 无参函数, 返回整型指针。              (函数的返回值为int*)
int (*func)(void);   //表示函数指针,可以指向无参, 且返回值为整型指针的函数。       (函数的返回值为int)

默认来说,.的优先级比*的优先级高,所以有的时候要用括号。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值