C++ 基础面试题
C/C++
struct AA
{
int a;
char b;
};
struct student{
char name[10];
AA a;
short b;
};
int main(){
AA aa;
char name[10];
int a;
short b;
cout<<"AA:" <<sizeof(aa)<<endl;
cout<<"name:" <<sizeof(name)<<endl;
cout<< "a:"<<sizeof(a)<<endl;
cout<< "b:"<<sizeof(b)<<endl;
cout<< "student:"<<sizeof(student)<<endl;
}
在函数体内,一个被声明为静态的变量在这一函数调用过程中维持不变。
全局变量和函数的一个共同点就是都具有外部链接属性,即不仅可以在当前源文件中使用,在其他源文件中使用 extern 声明后也可以使用
如果用static修饰后,它们的外部链接属性就会变为内部链接属性,即只能在当前源文件中使用。
// const int *p 等价于 int const *p 修饰的是p指向的内容 p = xxx地址(正确) *p = xxx值(错误)
// int * const p 修饰的是p的本身 p = xxx地址(都是错误的) *p = xxx值(都是正确)
动态多态的条件:
●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。
●通过基类对象的指针或者引用调用虚函数。
1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。
2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。
3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。
4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。
5. 虚函数的定义形式:virtual {method body}
纯虚函数的定义形式:virtual { } = 0;
在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。
10. 多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
a.编译时多态性:通过重载函数实现
b 运行时多态性:通过虚函数实现。
11. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。
C++
new和delete、new[ ]和delete[ ]一定要匹配使用,一定要匹配使用,一定要匹配使用!!!否则会出现内存泄漏甚至崩溃的问题
【new作用】
调用operator new 分配空间。
调用构造函数初始化对象。
【delete作用】
调用析构函数清理对象。
调用operator delete释放空间。
string ---long int:
int main ()
{
string a = "1234567890";
long b = atoi(a.c_str());
cout<<b<<endl;
return 0;
}
string lint_str(long int i_str)
{
stringstream os;
os<<i_str;
string s ;
os>>s;
return s;
}
#include <iostream>
using namespace std;
void func(void* t)
{
cout << "func1" << endl;
}
void func(int i)
{
cout << "func2" << endl;
}
int main()
{
func(NULL);
func(nullptr);
return 0;
}
输出:func1 、func2
NULL和nullptr都是代表空指针,但是NULL在重载函数的时候却匹配到了参数为int的那个版本。
其实NULL在C++中就是代表着0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧。
delete 释放new分配的单个对象指针指向的内存
delete[] 释放new分配的对象数组指针指向的内存
在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。
在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。
- 4.17 多线程和多进程的区别
- 4.18 实现atoi,即将"1234"转化成1234(int类型)
- 4.19 实现atof,即将"1.234"转换成1.234(float类型)
- 4.20 结构体和联合体的区别
一、结构体struct
各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
二、联合体union
各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。
#include<stdio.h>
//联合体
struct u4
{
int a;
char b;
short c;
}U5;
struct u5
{
char b;
int a;
short c;
}U6;
//主函数
int main(){
printf("%d\n",sizeof(U5));
printf("%d\n",sizeof(U6));
return 0;
}
//输出为
//8
//12
#include<stdio.h>
//联合体
union u2
{
char a;
int b;
short c;
double d;
int e[5];
}U3;
//主函数
int main(){
printf("%d\n",sizeof(U3));//输出24
return 0;
}
引用不可以为空,但指针可以为空,引用是对象的别名,引用为空——对象都不存在,怎么可能有别名.
故定义一个引用的时候,必须初始化。引用不可以改变指向;但是指针可以改变指向,而指向其它对象。虽然引用不可以改变指向,但是可以改变初始化对象的内容。
引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节。
当你写这种代码:
string *ps = new string("Memory Management");
你使用的new是new operator。
new操作符做两件事,分配内存+调用构造函数初始化。
operator new所了解的是内存分配,它对构造函数一无所知。
- 4.24 C++多态特性,父类和子类的区别
- 4.25 虚函数有哪些作用?多态的虚函数(父类和子类)返回值类型可以不一样吗?什么情况下,返回值类型不一样?
- 4.26 C++四种强制类型转换有哪些?每种特性是什么?有什么区别?
四种转换:static_cast、dynamic_cast、const_cast和reinterpre_cast.
- 4.27 函数重载
多个同名函数有不同的参数集
编译器根据不同参数的类型和个数产生调用匹配
函数重载用于处理不同数据类型的类似任务
函数名称必须相同。
参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
函数的返回类型可以相同也可以不相同。
仅仅返回类型不同不足以成为函数的重载。