c/c++常见相关面试问题

1.c/c++区别

————————————————————————
1.1 c++面向对象,c面向结构化过程。
1.2 c++具有封装继承多态特性。
1.3 c++相对于c增加了许多类型安全的功能,比如强制类型转换。
1.4 c++支持泛型编程,比如类模板,函数模板。

2.c++源代码–>exe的过程

————————————————————————
2.1 预处理阶段:对cpp中头文件,宏定义进行分析替换,生成预编译文件。
2.2 编译阶段:将预编译文件转为汇编代码,生成汇编代码。
2.3 汇编阶段:将2.2中生成的汇编代码生成可重定位的目标文件。
2.4 重定向阶段:将多个文件链接生成最终的可执行文件。

3.动态库和静态库的区别。

————————————————————————
3.1动态链接库在编译时不会进行绑定,在运行时载入功能实现,不同应用程序在调用相同的函数时,只需在再存中保存一份实例。
3.2 静态库在编译时完成连接,程序在运行时不再需要库函数,与库函数再无瓜葛,成为独立部分。
3.3 动态库相对静态库中只保留了必要的声明,而静态库包含全部内容。
3.4 动态库为*.so,静态库为 *.a

4.static关键字

4.1全局变量:存储在静态存储区,初始值需要手动指明;
作用域:定义之处开始,到文件结尾,其他文件不可见。
4.2局部变量:静态存储区,默认初始值为0,作用域:定义它的函数内部,但不会被销毁,等待再次调用。
4.3静态函数:只在生命文件中可见,只能在声明的cpp中使用,不会与其他cpp中的同名函数引起冲突。
注意:不要再头文件中声明static全局函数,不要再cpp内声明非static的全局函数,函数如需服用,需要将其提到头文件,否则在cpp内加上static修饰。
4.4类的静态成员:多个对象共享数据。
4.5 类静态函数:属于类静态成员,而非对象成员。
4.6类对象为静态。

C++11新特性————>智能指针

shared_ptr, unique_ptr weak_ptr

shared_ptr通过计数的方式对一块区域进行管理,当计数为0时,对内存块进行回收。

unique_ptr只允许有一个指针指向某块地址,超过1时会报错。

由于shared_ptr采用计数,如果有两个类,申请的内存区域互相指示,则计数器会爆炸,shared_ptr会导致内存泄露,因此需要weak_ptr弱指针来解决这个问题,弱指针在计数减1时不会索引到相关联的类或其他类型,不会产生shared_ptr的特殊情况产生的内存泄露。

c++11新特性————>虚函数override和final指示符。

override在子类虚函数声明最后添加,当其没有对父类对应的虚函数进行覆盖时,编译器会报错。
final指子类最后一个继承父类虚函数,当子类的子类再次继承时,会报错。

c++11新的特性————> 容器的cbegin cend函数

c代表const,在容器中使用迭代器一般是

for (vector<int>::iterator it=i.begin();it!=i.end();it++){
	//do here
}

当只读时,一般希望利用const类型,因此在c++11中给出了只可读的迭代器版本,cbegin和cend代替原来的begin,end。

c++11新特性之右值引用和std::move()

有变量名或者类名的量为左值,临时变量为右值。右值在c++11中分为将亡值和纯右值,普通的临时变量是纯右值,将T&&函数返回值和std::move()函数返回值认为是将亡值。

c++98中,只有左值引用。c++11中添加了右值引用。

int a=0; //a为左值
int& b=a; //正确,左值引用,a为左值,b为左值
int& c=1; //错误,&不能引用右值,1为右值
int&& d=1; //正确,c++11中右值引用特性。允许引用右值。直接将临时变量1的所有权交给d
int&& e=a; //错误,&&只允许引用右值,不允许给左值。
int&& f=std::move(a); //正确,std::move()输入一个左值,将其视为一个右值,提取其所有权,但并不改变a本身,
//相当于把一个左值变量当做右值引用。
//当a发生改变时,f一起改变,反之f改变,a也改变。
//这样做可以减少创建临时右值产生的构造函数、析构函数等,提高程序运行效率

std::move()与智能指针功能类似,用了模板技术,类对象转移时,本身不需要进行类内重置,参考代码:

class test{
public:
    int a=0;
    int b=1;
};

int main(){
    test test01;
    test&& test02=move(test01);
    test01.a=10;
    cout<<test02.a<<endl; //test02.a=10;
    return 0;
}

c++空类中的函数

class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty& ); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};

字节对齐问题

直接上图,32位对齐4个字节,在结构体中是8不是5.
在这里插入图片描述
数组引用相关问题

int test01(int arr[10]){ //正确。arr退化为int*
    return sizeof(arr)/sizeof(arr[0]); 
}

int test02(int (&arr)[10]){ //正确arr为整个数组
    return sizeof(arr)/sizeof(arr[0]);
}

int test03(int& arr[10]){ //错误,引用输入不能为地址->(int& arr)
    return sizeof(arr)/sizeof(arr[0]);
}

int main() {
    int arr[]={0,1,2,3,4,5,6,7,8,9};
    cout<<test01(arr)<<endl; //1  (4/4)

    cout<<test02(arr)<<endl; //10 (40/4)
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值