C++ 面试基础

1.Static 

Staic特点:只初始化一次,存在静态区,区别于Auto 变量,存在于栈中(函数结束,也就销毁)。

类内的staic:静态数据成员必须在类外初始化,静态成员函数只能调用静态变量,两者都不能用this指针调用。

2.Const

const int *a== int const* a a可变,a指向的对象不可变

int* const a : a不可变,指向对象可变

3.Switch

switch 的break 如果不写,就会在满足改条件的语句一直执行,直到break,或者函数结束;

4.为什么:

char str1*=“abc”;

char str*2=“abc”;

str1==str2成立? abc 存储在常量区域,大多数编译器都会把相同的常量只保持1份拷贝,所以str1和str2指向的地址是相同的。

5.Assert

Assert和assert的区别:前者在Debug版本中有,在Relase 版本不存在,而assert 都会存在;

#define NDEBUG 可以禁止调用宏;

6.enum

enum(a,b=1,c,d=2,e) == 0,1,2,2,3

7.argc和argv[]

(Test.c)int main (int argc,int*argv[]){.....}

命令行输入: Hong bi yue I 

argv[]=[Test, Hong,bi,yue,I ];

argc=5;

8.main 函数结束后

main 函数结束后,如果还想继续执行代码,可以再析构函数里面执行

9.++

a.

*p++ : *p -> p++ 地址加;

(*p)++ : (*p)++ 值加;

b.

s++=5 :错误,先执行取a的地址,装入寄存器,然后临时变量为a的值加1,程序不允许对临时变量赋值;

++s=5 :正确,取a地址,内容+1,放入寄存器;

10.浮点数的注意事项:

float a,b,c;

1.if(a==0): 浮点数存在精度问题,不是一个确切的值,需要转化为:>= 或者<=;

2. a+b=b+a;

 (a+b)+c 不一定等于 :(a+c)+b 浮点运算是不能被结合的 ------------???不懂

11.String 类实现注意点:

1.String :: String(const String &another)

{

   char* m_data;  //以调用strcpy()函数,故用指针

  m_data= new char[strlen(another.m_data)+1]

  strcpy (m.data,another.m_data);

}

12.extern 和 export

 注:头文件中一般不定义变量,会引起重复定义,即使用 #ifdef,虽然头文件只被编译了一次,但是变量不只是会定义一次;

extren int n;

export template<class T> void f(T& t);

13 内存分配

(1)符号起始区块(BSS) :静态数据+ 未初始化的全局数据

(2)数据段: 静态内存分配,已初始化的全局数据

(3)代码段:程序执行代码

(4)堆 :动态分配的内存:malloc 和 new

(5)栈 :临时创建的局部变量

 14.#include<>和“”

    <>软件设置指定的路径 查找,如果有,直接加载;如果没有,报错(无法找到库文件)。

    “ ”源代码文件(C或CPP文件)所在的文件夹;如果没有,就会在TurboC软件设置指定的路径 ,如果有,直接加载;如果没有,报错(无法找到库文件)。

15.struct 和class

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

16. sizeof()

    1.为什么会有sizeof()?

      在访问内存的过程中,地址总线总是按照对齐后的地址来访问,如果编译器对数据存储进行处理会加快读写速度

   2.bool 2,int 4,char 2,类内函数为0,short 2,long 4,double 是8,int f()返回4,空类是1,多重继承的空类是1,虚继承的类是4(涉及虚指针)

    32位系统 char是1位;

   3.{bool a,int b,bool c}=3*4=12; {int a ;bool b,bool c}=2*4=8;

  4.类内存放的静态变量是放在全局数据中的,在sizeof类时,只是计算栈的大小,所以不计算静态变量

  5. char*s[100]="0123456789";

     sizeof(ss)=100;strlen(ss)=10: strlen通过循环,检测到/0结束

17.数组指针和指针数组

   int a[2][5] ={.......};  int(*b)[5] =a数组指针:*a=&a[0][0],**a=a[0][0];*a+1=&a[0][1];*(a+1)=&a[1][0];

18.向量容器:

   顺序容器:队成员的顺序访问和随机访问 vector、list、deque

   关联容器:经过优化关键值访问他们的元素 map是key-value形式,set是单值

 set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。Set默认自动排序。使用方法类似list。

19.多态:

    1.覆盖:多态,面向对象,动态,编译期间并不能确定;重载:函数重载,静态,编译期可以确定,接口重用

    2.定义 基类 Base对象 b 虚函数为show()   b.show();可以调用虚函数Base::show();但是这种调用在编译时进行的是静态连编,没有充分利用虚函数的特性,只有通过基类指针访问虚函数是才能获得运行时的多态性。

    3.虚函数不是必须重载的,但是虚基类(虚基类是为了只实例化一次基类存在的,孙子类继承父类,爷爷类,但是孙子还有叔叔,如果不用虚基类,孙子在继承爷爷类时,就认为有两个爷爷)必须重载

   4.

 20.友元函数

    类内声明的函数,可以访问类内的private数据

 

 

 

 

  

  

 

posted on 2017-07-15 21:54  壮心泯未  阅读(262)  评论(0编辑  收藏  举报

导航