C++ 面试中常见11个问题

本系列将会以思维导图形式梳理C++面试中常见问题。


static 关键字作用


const关键字作用

#define var 100
int a, b;
a = var;
b = var;
//内存被分配两次
const int var = 100;
a = var;
b = var;
// 内存被分配一次

// const 修饰指针 离谁近修饰谁
//常量指针 不能被修改 
char * const ptr;
// 指针常量 类型所描述的内存区域不能被修改
const char * ptr = "hello word"
    

指针与引用


如何避免野指针


malloc free和new delete的区别


extern 关键字作用


extern代码示例
  1. 文件里面 extern
#include <stdio.h>

int main() {
    extern int var_main;
    extern void func_main();
    func_main();
    printf("main var_main = %d\n", var_main);
    return 0;
}

int var_main = 100;
void func_main() {
    printf("main var_main = %d\n", var_main);
}
  1. 文件外面
#include <stdio.h>

int var_other = 99;

void func_other() {
    printf("func_other var_other = %d\n", var_other);
}
#include <stdio.h>

int main() {
    extern int var_main;
    extern int var_other;
    extern void func_main();
    extern void func_other();
    func_main();
    printf("main var_main = %d\n", var_main);
    func_other();
    printf("main var_other = %d\n", var_other);
    return 0;
}

int var_main = 100;
void func_main() {
    printf("main var_main = %d\n", var_main);
}
  1. C++中访问C中变量
#include <stdio.h>

int var_c = 99;

void func_c() {
    printf("func_c var_c = %d\n", var_c);
}
#include <stdio.h>

extern "C" int var_c;
extern "C" void func_c();
int main() {
    func_c();
    var_c = 100;
    printf("extern_cpp var_c=%d\n", var_c);
    return 0;
}

注意:需要分别编译,然后链接生成目标文件。
:::info
gcc extern_c.c -c
gcc extern_cpp.cpp -c
gcc extern_c.o extern_cpp.o -o extern_cplus_c
:::

简述strcpy、sprintf和memcpy的区别


代码示例
#include <stdio.h>
#include <string.h>

int main() {
    char buf_a[64] = {0};
    char buf_b[64]= {'a', 'b', 'c', '\0', 'd'};
    char *str = strcpy(buf_a, buf_b);
    printf("str = %s, buf_a = %s\n", str, buf_a);
    return 0;
}

运行结果:
:::info
str = abc, buf_a = abc
:::

#include <stdio.h>
#include <string.h>

int main() {
    char buf_a[64] = {'z', 'z', 's', 'd', 'a'};
    char buf_b[64] = {'a', 'b', 'c', '\0', 'd'};
    
    memcpy(buf_a, buf_b, 3);
    printf("buf_a:%s\n", buf_a);
    memcpy(buf_a, buf_b, 4);
    printf("buf_a:%s\n", buf_a);
    memcpy(buf_a, buf_b, 5);
    printf("buf_a:%s\n", buf_a);
    
    char *str = strcpy(buf_a, buf_b);
    printf("str = %s, buf_a = %s\n", str, buf_a);
    
    int n = sprintf(buf_a, "len:%d str:%s addr:%p\n", 6, buf_b, buf_b);
    printf("n = %d, buf_a = %s\n", n, buf_a);
    
    return 0;
}

运行结果:
:::info
buf_a:abcda
buf_a:abc
buf_a:abc
str = abc, buf_a = abc
n = 34, buf_a = len:6 str:abc addr:0x7ffe34e6a940
:::

C/C++中类型转换以及使用场景


C++什么时候能生成默认构造函数


C++什么时候默认生成拷贝构造函数


什么是深拷贝?什么是浅拷贝?

参考

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值