C++面试秘笈笔记

c++程序基础

1.sizeof(str)数组中要保留结束符(需+1),数组变量和指针一样 在win32下为4个字节

虚函数指针表占4个字节 static成员变量属于类域 不算入对象为0,对齐原则(不同类型之间 且默认为4) ,空类为1 对于union联合体的大小取决于他所有成员占用空间最大的成员大小

2.sizeof与strlen区别

char str[20]="1234567890";

sizeof(str)=20; strlen(str)=10;

char* ss="1234567890";

sizeof(ss)=4 strlen(ss)=10;

3.为何引入内联函数:替代宏定义来解决程序中函数调用的效率问题

宏定义缺点:无法对参数进行有效性检测 不可强制转化 如果涉及类和类的访问 则无法实现(inline可以解决这些问题)

两者区别: 内联函数在编译时展开,宏在预编译时展开

编译时 内联函数直接镶嵌在目标代码中,,宏简单文本替换

注意参数的二义性

4.不宜使用内联函数(以代码膨胀为代价)的情况: 代码较长,函数体内有循环 

指针和引用

1. a=10;

   int &rn=a;//rn是a的一个引用

   rn=100;//rn的值改变就是a的改变 则a 也为100

   &a=&rn//此时&为取址符 rn和a占内存中同一存储单元

2.引用和指针的区别:

引用必须被初始化,指针不必初始化(未初始化时为野指针,危险)

引用初始化后不能改变引用对象 而指针可以改变指向对象

不存在指向空值的引用 但存在指向空值的指针

测试需要区别:由于引用不会指向空值,引用前则不需要测试它的合法性;而指针则需要(安全性)

应用的区别:如果指向对象不变,则使用引用,如果有指向NULL或者不同时刻指向对象不同则使用指针

3.指针赋值

char a[]="hello world'' ;

char* p=a;

*(p+4)+=1;//*(p+4)指向o,+1后为p

4.指针的加减操作

int a[5]={1,2,3,4,5};

int *ptr=(int*)(&a+1);//&a是对象(数组)的地址,此时为a[5]的地址,已经越界

*(a+1);//a+1为数组下一个元素的地址

5.指针比较

char str1[]="abc";

char str2[]="abc";

char *str3="abc";

const char* str4="abc";

cout<<"str1==str2"<<endl;//输出为0,str1,str2在栈中分配,但位置不同

cout<<"str3==str4"<<endl;//输出为1,"abc"放在数据区,这两个指针指向同一个内存位置

6.指针常量与常量指针区别

int const *p1 = &b;//const 在前,定义为常量指针  

int *const p2 = &c;//*在前,定义为指针常量   

常量指针p1:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。   

    p1 = &a是正确的,但 *p1 = a是错误的。
指针常量p2:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。
    p2= &a是错误的,而*p2 = a 是正确的。

7.类的非静态成员函数才有this指针

8.指针数组与数组指针区别

指针数组:一个数组里存放的是同一类型的指针 

int* a[10];//占用40位字节

数组指针:一个指向一维或多维数组的指针

int* b=new int[10];//需要delete[]防止内存泄漏

9.野指针

野指针成因:(1)指针变量为初始化 (2) p被free或者delete后没有置为NULL

10.malloc与free是C库函数,new与delete是C++运算符,都用于申请动态内存和释放内存

对类而言,malloc不能调用析构函数和构造函数,但new可以

11.内存的分配方式

(1)从静态存储区分配:全局变量,常量

(2)在栈上创建:局部变量

(3)从堆上分配:(动态分配内存)malloc new申请

 字符串

1. 使用库函数将数字转化为字符串

itoa(num_int,str_int,10);//把整数转化为str,为十进制的转化

gcvt(num_double,8,str_double);//把浮点型转化为str,8表示精确位数

2.位运算:

左移操作<<相当于乘2,

右移操作<<相当于除以2

x|=y; 等价于x=x|y; 为位运算里面的或

x&=~y 等价于 x=x&(~y); 先对y取反 再和x做与运算

3.#define 中UL(无符号长整型)放在最尾,

不能以分号结束

4.关键字static的作用是什么

(1)在函数体内,静态变量在被调用过程中保持不变

(2)在模块内(函数体外),可以被模块内所有函数访问,为本地的全局变量

5.volatile含义:优化器在用到这个变量时必须每次小心重新读取这个变量的值,而不是使用寄存器中的备份

C++面向对象

1.C/C++最大区别:

C是面向过程的编程语言,它以过程为中心,以算法为驱动;

C++时面向对象的,即使用以对象为中心,以消息为驱动的编程方式.

2.class和strcut区别:
(1)C语言中struct只是作为一种复杂数据类型的定义,不是面向对象

(2)class默认是private,struct默认为public,且class还可用于表示模板类型

 

原文地址:https://www.cnblogs.com/zhaodun/p/7203082.html