1、对于一个频繁使用的短小函数,在c语言中应用什么实现,在c++中应用什么实现
答:c:宏定义;c++:inline内联函数
2、全局变量和局部变量的区别?
答:
1、生命周期不同:
全局变量:随主程序创建而创建,随主程序结束而销毁。
局部变量:函数或者{}括号内部,退出或执行完就销毁
2、作用域不同:
全局变量:源文件内所有函数都可以使用
局部变量:函数内部或者{}括号内部有效,只能局部使用
3、内存分配不同:
全局变量:全局数据段并且在程序运行的时候加载
局部变量:分配在堆栈里
3、在申请内存找不大足够大的内存块,malloc和new将返回NULL指针,内存申请失败,怎么处理内存耗尽?
答:直接return
4、如何判断一个操作系统是16位还是32位系统
答:
1、使用变量指针*p,sizeof(p) == 2 为16位,==4 为32位
2、unsigned int a = ~0; if( a > 65536 ) 为32位,否则 16位
5、为什么数组名做参数会改变数组内容?
答:数组名就是数组的首地址
6、析构函数和虚函数的用法和作用?
答:
析构函数:是c++特殊的类成员函数,没返回值、没参数、不能调用。在类对象执行完毕,作用是销毁并释放内存。
虚函数:是c++多态的一种表现,使用虚函数可以动态绑定,当然也会以系统开销为代价的
7、引用和指针有什么区别?
答:
引用:必须初始化;初始化后不能改变;不存在指向空值
指针:不必初始化;指针可以改变所指对象;指针可以指向空值
8、虚函数只能借助引用或者指针来达到多态的效果。
9、在c++中能否有虚构造函数?
答:不能,只能有虚析构函数。
10、重载、重写、重定义的区别?
答:
重载:类对象的同名不同参函数
重写:子类继承父类的函数
重定义:子类继承父类的虚函数
11、i++和++i的效率比较
答:
-》内建数据类型的情况,效率一样
-》自定义数据类型的情况,++i效率高
12、理解内联函数和宏的区别
答:
-》内联函数在编译时展开,宏在预编译时展开
-》在编译的时候,内联函数可以直接嵌套到目标代码中,宏只是一个简单的文本替换
-》内联函数可以完成类型检测、语句检查等功能,宏不具有这样的功能
13、引用和指针易错点:
-》int &c:引用类型的变量必须初始化。
-》int &d = 2,&d = c:引用类型只能初始化的时候赋值
-》int *p; *p = 5:*p是野指针,直接赋值很危险
14、类的静态成员和静态函数:
-》静态成员 不能在内部初始化,只能在类定义外面初始化
-》静态函数,在类外使用,因它不含this指针,所以不能调用类内的非静态成员
15、explicit构造函数:作用是防止隐式转换
16、赋值构造函数与复制构造函数的区别
赋值构造函数:引用指针对象
格式: A& operator = (const A& other)
clas A;
A a;
A b;
b = a;// 赋值调用
复制构造函数:复制指针对象;以参数传进来的对象初始化产生一个对象
格式:A(const A& other):m_i(other.m_i)
A a;
A b = a;//复制构造函数调用
17、临时对象在什么情况下产山(会影响程序的执行效率)
-》参数按值传递
void fun1( Test test);
-》返回值按值传递
void fun1( ){
Test t(2);
teturn t;
}
解决办法:改成对象引用传入
void fun1( Test &test);
18、內存申請,使用之前檢查
-》函數參數:
assert( p != NULL);
-》malloc或者new
if( p != NULL )
释放了内存却继续使用它。
有三种情况:
(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。
(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
(3)使用free或delete释放了内存后,没有将指针设置为null。导致产生“野指针”。
【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为null。防止使用指针值为null的内存。
【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
【规则4】动态内存的申请与释放必须配对,防止内存泄漏。
【规则5】用free或delete释放了内存之后,立即将指针设置为null,防止产生“野指针”。