C与C++的常错小细节

7 篇文章 0 订阅

C与C++的常错小细节

1.fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回。如果返回值是0,则表示是子进程,如果返回值>0,则表示是父进程。
在fork()调用处整个父进程空间会原模原样地复制到子进程中,包括指令、变量值、程序调用栈、环境变量、缓冲区等。
2.const char *node="ABC";      指向字符常量的指针     *node的值不能改变,node的指向可以改变
当const出现在*前时,表示*node的值不能改变,在*之后时表示node的指向不能改变
3.数组名是一个常量,不能进行赋值运算
4.多线程需要考虑保护全局变量和静态变量
5.16位机器中,默认对齐数为2字节,char类型占一个字节,int类型占两个字节
6.局部变量在函数调用结束会被释放,静态局部变量在退出作用域后不能使用
7.定义结构体时,不能定义该结构体类型的变量
8.一个类有父类,内部还有一个其他类的成员对象,在执行构造函数时的执行顺序是父类-成员对象-自己
9.malloc开辟的空间在动态存储区
10.以下程序的输出

绝不重新定义继承而来的缺省参数值
解析:p->test()的执行过程:(1)由于B类中没有重写父类的虚函数test(),因此会调用父类A的test()
                   (2)A中test()函数中继续调用虚函数func(),因为虚函数执行动态绑定,p此时的动态绑定(即目前所指对象的类型)是B*,因此此时调用虚函数func()时,执行的是B类中的func(),所以先输出“B->”
                   (3)缺省参数值是静态绑定,即此时val的值使用的是父类A中的缺省参数值,其值在编译时已经绑定,值为“1”
 
11.类的非静态成员函数才有隐含的this指针
12.以下代码输出结果

short占两个字节,可以表示的最大整数是65535

13.int(*pt)[3];  定义了一个名为pt的指针变量,指向每行有三个整数元素的二维数组
14.抽象类指的是含有纯虚函数的类,该类不能创建对象,只能声明指针和引用
15.类中的隐含this指针是一个常量指针,指向不能修改
16.Debug版本有断言保护,Release版本中没有断言
17.对以下数据结构中data的处理方式

编译器会认为data是一个长度为0的数组,且支持对于数组data的越界访问
18.递归函数不能作为内联函数,虚函数可以作为内联函数
19.静态数据成员可以直接用类名调用
20.类A的静态数据成员为类A的所有对象共享
21.类A的友元函数可以访问类A的私有成员
22.类A的静态成员函数没有传递this指针作为参数
23.类A的友元类可以访问类A的所有成员
24.#include <> 表示从标准库文件目录下搜索
  #include “” 表示首先从用户工作目录下开始搜索
25.数组名是一级指针,数组地址是二级地址
26.构造函数可以重载,析构函数不能重载
27.malloc函数进行内存分配是在执行阶段
28.在Linux系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到BSS段
29.头文件中的ifndef/define/endif用于防止头文件被重复引用
30.常量不能++和--
31.C++中只有构造函数可以抛出异常,析构函数不可以
32.C++不是类型安全的语言
33.int *part[10]=&arr;  指针数组
  int (*parr)[10]=&arr;  数组指针
34.C++中定义一个引用对象和指针对象时不用调用构造函数
35.static修饰的局部变量的相关知识
 (1)静态变量在内存的静态存储区,静态数据一直占有着该存储区单元直到程序结束
 (2)静态局部变量只声明一次,一旦内存申请成功,不接受重复申请
 (3)静态局部变量的作用域比一般局部变量长,直到程序运行结束才释放,但只在该函数内可访问
36.C语言的标识符分为三类:关键字、预定义标识符、用户标识符
37.堆向内存增加的方向增长,栈向内存减小的方向增长
38.C++类体系中,不能被派生类继承的有:构造函数、析构函数、赋值运算符重载函数、友元函数
39.构造函数中成员变量一定要通过初始化列表来初始化的有以下几种
 (1)const常量成员变量
 (2)引用类型的成员变量
 (3)没有默认构造函数的类类型
40.一般应将小循环放在外边,大循环放在里面
41.动态数组在堆上开辟
42.c_str()返回值是const char *,返回指向字符串的指针
43.用volatile修饰的变量每次都会从内存中读取
44.const声明的变量在编译阶段完成
45.类A是类B的友元,类C是类A的公有派生类,忽略特殊情况,则类C不是类B的友元,类B不是类A的友元
46.C++STL容器中支持“[]”运算的有:vector、deque、map、unordered_map、string
47.<>不属于C语言程序运算符
48.cin遇到空格时停止输入,cin和cout 是类iostream的对象
49.不能声明为虚函数的有:静态成员函数、内联函数、构造函数
50.堆不能进行静态分配
51.在C++中,为了让某个子类只能通过new来创建,则应该讲析构函数设为私有
52.关于makefile的描述
 (1)makefile文件保存了编译器和连接器的参数选项
 (2)主要包含:显示规则、隐晦规则、变量定义、文件指示和注释
 (3)默认情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Mkaefile”的文件,找到了解释这个文件
53.重复多次fclose一个打开过一次的FILE *fp指针会导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常
54.用户态切换到内核的3中方式:系统调用、异常、外围设备的中断
55.32位编译器下,sizeof(void)的值是编译错误或1
56.宏替换不占用程序运行的时间
57.通用多态是指包含多态和参数多态
58.静态变量不占用内存,存储在全局区
59.给你1、2、3这三个数字,可以使用C的各种运算符,能表示的最大整数是sizeof(3)<<(sizeof(2)<<sizeof(1))
60.标准里的string在多线程下并不保证都是安全的,只提供两种安全机制
 (1)多线程同时读取数据是安全的
 (2)只有一个线程在写数据是安全的
61.switch中不允许的数据类型有浮点型和字符串
62.引用不可以是void类型
63.使用NEW[]申请,delect释放时,不会有内存泄漏,但不建议使用
64.C++中能作为函数重载判断依据的是const、参数个数、参数类型
65.接口即为包含纯虚函数的抽象类
66.线程间同步的方式:临界区、互斥区、事件、信号量
67.关于volatile:
 (1)当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中,以后再读取变量时,直接从存储器中取值
 (2)优化器用到volatile变量时必须每次都重新读取这个变量的值,而不是使用保存在寄存器里的备份
 (3)volatile适用于多线程应用中被几个任务共享的变量
68.一个类定义中,只要有一个函数模板,则这个类是个类模板
69.在重载一个运算符为成员函数时,其参数列表中没有任何参数,说明该运算符是前缀一元运算符
70.关于迭代器失效:
 (1)map的插入操作不会导致迭代器失效
 (2)vector的删除操作只会导致指向被删除的元素及后面的迭代器失效
 (3)map的删除操作只会导致指向被删除元素的迭代器失效
71.静态成员函数可以直接用类名调用
72.抽象类:类中至少有一个方法是抽象方法
  接口:类中的方法全部是抽象方法
73.全局变量可以定义在被多个.c文件包含的头文件中
74.前置++比后置++效率更高
75.表在建立索引时,update、delete、insert是需要维护索引的
76.B继承自A  A* =new B()    父类构造->子类构造->子类析构->父类析构(先构造的后析构)



这些都是我在刷笔试题是遇到的一些细节问题,可能会有些错误吧,望指正。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值