首页 > 编程语言 > 详细

C/C++ 复习

时间:2019-09-16 09:56:43      阅读:55      评论:0      收藏:0      [点我收藏+]

本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有

关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等
语法问题
类型转换
指针以及指针和引用的区别
面向对象的相关问题,如虚函数机制等
泛型编程的相关问题,如模板和函数的区别等
内存管理,如字节对齐(内存对齐)、动态内存管理、内存泄漏等
编译和链接
实现函数和类
本文不涉及STL的内容,有关STL的内容,会另有一篇文章专门总结。
零、序章
0.1 C++与C的对比
C++有三种编程方式:过程性,面向对象,泛型编程。
C++函数符号由 函数名+参数类型 组成,C只有函数名。所以,C没有函数重载的概念。
C++ 在 C的基础上增加了封装、继承、多态的概念
C++增加了泛型编程
C++增加了异常处理,C没有异常处理
C++增加了bool型
C++允许无名的函数形参(如果这个形参没有被用到的话)
C允许main函数调用自己
C++支持默认参数,C不支持
C语言中,局部变量必须在函数开头定义,不允许类似for(int a = 0; ;;)这种定义方法。
C++增加了引用
C允许变长数组,C++不允许
C中函数原型可选,C++中在调用之前必须声明函数原型
C++增加了STL标准模板库来支持数据结构和算法
一、重要的关键字极其用法
1.1 const 
主要用法
C++ 的const关键字的作用有很多,几乎无处不在,面试中往往会问“说一说const有哪些用法”。下面是一些常见的const用法的总结:
 const 变量

const int a;

不能修改值,必须初始化

 const 类对象

const MyClass a;

不能修改成员变量的值,不能调用非 const 函数

 指向 const 变量的指针

const int * a;

指向内容不可变,指向可变

 const 指针

int * const a;

指向内容可变,指向不可变

 指向 const 变量的 const 指针

const int * const a;

指向内容不可变,指向也不可变

const 引用

 const 变量作为函数参数

void myfun(const int a);

函数内部不能改变此参数

指向 const 变量的指针做参数,允许上层用一般指针调用。(反之不可)

 const 返回值

const string& myfun(void);

用于返回const引用

上层不能使用返回的引用来修改对象

 const 成员变量

const int a;

static const int a;

必须在初始化列表初始化,之后不能改变

static const 成员变量需要单独定义和初始化

const 成员函数

void myfun(void) const;

this指针为指向const对象的const指针

不能修改 非mutable 的成员变量

除此以外,const的用法还有:
const引用可以引用右值,如const int& a = 1; 
注:
const 成员方法本质上是使得this指针是指向const对象的指针,所以在const方法内,
const 成员函数可以被非const和const对象调用,而const对象只能调用const 成员函数。原因得从C++底层找,C++方法调用时,会传一个隐形的this参数(本质上是对象的地址,形参名为this)进去,所有成员方法的第一个参数是this隐形指针。const成员函数的this指针是指向const对象的const指针,当非const对象调用const方法时,实参this指针的类型是非const对象的const指针,赋给const对象的const指针没有问题;但是如果const对象调用非const方法,此时实参this指针是指向const对象的const指针,无法赋给非const对象的const指针,所以无法调用。注意this实参是放在ecx寄存器中,而不是压入栈中,这是this的特殊之处。在类的非成员函数中如果要用到类的成员变量,就可以通过访问ecx寄存器来得到指向对象的this指针,然后再通过this指针加上成员变量的偏移量来找到相应的成员变量。http://blog.csdn.net/starlee/article/details/2062586/
const 指针、指向const的指针和指向const的const指针,涉及到const的特性“const左效、最左右效”
const 全局变量有内部链接性,即不同的文件可以定义不同的同名const全局变量,使用extern定义可以消除内部链接性,称为类似全局变量,如extern const int a = 10.另一个文件使用extern const int a; 来引用。而且编译器会在编译时,将const变量替换为它的值,类似define那样。
const 常量和define 的区别
const常量有数据类型,而宏定义没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意想不到的错误(边际效应)。
有些集成化的调试工具可以对const常量进行调试,但是不能对宏定义进行调试。
在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
内存空间的分配上。define进行宏定义的时候,不会分配内存空间,编译时会在main函数里进行替换,只是单纯的替换,不会进行任何检查,比如类型,语句结构等,即宏定义常量只是纯粹的置放关系,如#define null 0;编译器在遇到null时总是用0代替null它没有数据类型.而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查,所以const与define之间的区别在于const定义常量排除了程序之间的不安全性.
const常量存在于程序的数据段,#define常量存在于程序的代码段
const常量存在“常量折叠”,在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表,可以算作一种编译优化。因为编译器在优化的过程中,会把碰见的const全部以内容替换掉,类似宏。
————————————————
版权声明:本文为CSDN博主「csdn_chai」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csdn_chai/article/details/78041050

C/C++ 复习

原文:https://www.cnblogs.com/sylar5/p/11525600.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!