c++总结

-------------------------------------------------------------------------------
可以通过查找功能找到相关的知识点。
-------------------------------------------------------------------------------
1、c++中使用c语言的头文件要注意什么?
答、库名要加c,且不能有.h,且要加using namespace std;例如#include<cstring>。
2、int arr[10]={1,2,3,4,5,6},cout<<3[arr];这个代码能打印吗?这能说明什么?
答、可以,和cout<<arr[3]相同,本质是3[arr]会被解释成*(3+arr);arr[3]也会被解释成*(arr+3).
3、C++泛型编程的含义?
答、用c++的模板编程。
4、程序调用系统函数,这种程序的移植性是怎样的?
答、很差。
5、C++标准头文件需要加.h吗?
答、不需要。
6、C++标准头文件引入后能直接使用吗?为什么
答、不能,需要加上using namespace std;C++有为标准库存储的命令空间,std,所有标准头文件都会存储在里面,这说明c++标准头文件不是公开的,
使用时需要使用using namespace std;打开命令空间。
7、标准输出设备是什么?
答、屏幕。
8、endl的作用是什么?
答、回车换行,刷新缓冲区。它的本质是一个函数。
9、什么时候缓冲区才会刷新?
答、换行,缓冲区满了,或者强制手动刷新缓冲区。
10、c++中结构体与c语言中结构体有什么区别?
答、c++中用结构体定义变量不需要加struct,而且,可以在结构体内定义函数。
11、c++和c语言的类型转换的区别?
答、c++中要求严格的类型转换。
12、C++中三目运算符返回的是值还是内存(内存内存储了这个值)?C语言呢?
答、C++中是内存(变量本身),C语言中是值.
14、觅食。


16、vs比较卡怎么办?
答、360深度清理。
17、如何增加程序的健壮性?
答、合理使用const。
18、C++中的const是默认static(内部链接),但是使用extern可以让其外部链接,C语言中const是extern类型(全局作用)?
答、对。
19、C++中在main函数外定义的const 变量放在什么地方?
答、常量区,一旦初始化,不能修改。
20、C++中const局部变量放在什么地方?
答、栈区,可通过地址修改。
21、
const int a=10;
int *p=(int *)&a;
*p=100;
cout<<"a="<<a<<endl;
cout <<"*p="<<*p<<endl;
问输出什么,为什么?
答、a=10;
*p=100;
因为a会被优化,直接使用a时会用10取代a;但是a变量的内存空间的值会变成100;
22、如何防止上题中的编译器进行优化?
答、用volatile const int a=10;这样打印结果是a=100;*p=100;
23、
int b=100;
const int a=b;
int *p=(int *)&a;
*p=200;
cout<<"a="<<a<<endl;
问会不会对变量a进行优化?
答、不会,打印200;而不是100;
24、const int b=100;
const int a=b;
int *p=(int *)&a;
*p=200;
cout<<"a="<<a<<endl;
问会不会对变量a进行优化?
答、会,a=100;
25、引用的优点?
答、比指针更有效率,代码更简洁,能达到指针的功能。
26、引用的本质?
答、
27、引用引入的初衷是为了什么?
答、运算符重载。
28、引用的返回要求是什么?
答、必须是合法的内存空间。如果空间返回后就释放了,会出错。
29、int doit()
{     
static int a=10;
return a;
}


int main()
{
doit()=100;
return 0;
}
问有什么问题?
答、a返回的是一个字面值,显然不能作为左值。
可以改成
int &doit()
{
static int a=10;
return a;
}


int main()
{
doit()=100;
return 0;
}
30、问引用作为函数返回的时候,用一个非引用变量来接,和用一个引用变量来接所有什么区别?
答、用非引用来接,引用返回的是值,用引用来接,返回的是内存空间。
31、C++中默认参数的设置有什么要求?
答、默认参数后面的变量,也必须是默认的,例如
int func(int a,int b=0,int c);
这种定义是错误的,改为int c=0;即可。
32、函数参数顺序不同,能不能被重载?
答、可以。
33、函数的返回值类型,能不能作为重载的条件?
答、不能。
34、void func()
{
}


void func(double a)
{


}


void func(int a)
{


}




int main()
{
func(10);
}
问函数调用什么?如果func(int a)被删掉,函数调用什么?
答、未删调用func(int a);删掉调用func(double a);
35、函数重载是怎么实现的?
答、通过编译时对函数名进行修饰来实现,区分。
36、为了让c语言编写的程序能够被c++编译器指定按照c语言的方式编译,要采用什么方式?原理是什么?为什么要这样改变?
答、使用extern "c",原理是告诉c++编译器在extern “c”作用范围内的代码(一般是函数)要用c语言的方式编译。
原理是在对这段代码中的函数进行编译时,按照c语言的编译方式。如果没有extern “c”形式语法,会按照c++的方式编译函数例如 int ptr(int a);
ptr会被编译修饰成ptr_int。这是因为c++是支持函数重载,必须这样编译。而c语言不会。所以c++编译后的函数名找不到本该由c语言定义的函数名。
总的来说,最主要的原因是c语言不支持函数重载,c++支持函数重载,它们对函数的编译和查找链接函数是不一样的。
注意到底是按什么方式编译通常是由文件名决定,例如.c或.cpp。
37、const int constA = 10;
    int *p = (int *)&constA;
    *p = 300;
    cout << "\n%d\n" << constA << endl;
    cout << "%d\n" << *p << endl;
问,在c++中会优化吗?加const变量优化的含义,如果const int constA=10在函数外也会优化吗?如果不想const修饰的变量constA被优化,可以怎么做?
答、会,输出结果是10,300;这个在c语言中是相同的,而且改变cout为printf输出结果也是相同的,如果在函数外就不存在优不优化问题,因为默认变量存储在只读常量区,
是不能修改变量的值的。而且变量在只读数据段有对应的存储空间。只是它是写保护的。如果不想constA
38、const int constA = 10;
     int main(){
           int* p = (int*)&constA;
           *p = 200;
     }
问这段代码能不能在c++中编译通过?能运行吗?
答、可以编译通过,但是不能运行。运行提示错误:引发了异常: 写入访问权限冲突。这个现象与c语言中相同。
39、volatile什么含义?
答、不稳定的。
40、如何不让const修饰的变量发生编译器优化现象?
答、在const前面加volatile。
41、说说const编译器优化?
答、①、const修饰的变量,是局部变量,初始赋值时是一个字面值例如 const int a=19;或一个非常量变量,
例如 int b=20;const int a=b;如果使用指针改变其内存空间的数据,当直接使用变量名时,会将变量名替
换成const初始化的值。而不是改变后的值。
    ②、const修饰的变量,是局部变量,初始赋值时是一个常量例如 const int b=20;const int a=b;则编译器会优化。
    ③、加volatile,编译器不会发生优化。
42、注意c++是对c语言扩展以及改进的好处?
答、按照这个思想,要对与c中有相同的语法的细节性属性进行思考,注意这些语法的功能往往比c语言更加人性化,更合理。
注意词语:增强、兼容c、拓展、实现c不能实现的、严格。
43、06 请说出以下代码是否会发生编译错误,如果发生是哪一行代码会发生?并说明原因
int add(int a,int b)
{
return a + b;
}


double add(double a,double b)
{
return a + b;
}


void test()
{
int a = 10;
int b = 20;
double c = 7.5;
double d = 9.2;


cout << add(a, b) << endl;
cout << add(c, d) << endl;
cout << add(a, c) << endl;
}
答、cout << add(a, c) << endl;会报错,因为没有对应的重载函数
问这种表述正确吗?
答、不正确,因为不能正常工作的原因是存在多个版本的函数都能匹配函数调用。如果把第一个add函数
int add(int a,int b)的定义删除,发现都可以编译。int 和double之间可以转换的。
44、05 请描述内联函数的作用?以及内联函数和宏函数的区别?
答、预处理时宏函数虽然可以在调用函数时直接找到函数的定义,提高效率,但是宏函数会带来难以发现的错误,而且c++中的类成员,是不允许使用宏函数。
为了即能达到宏函数的功能,又可以避免宏函数的缺点,c++中引入了内联函数,内联函数没有函数调用时开销,内联函数可以像普通函数那样,进行参数、
返回值类型的安全检查,而且可以作为成员函数。
问哪里有错?
答、"预处理时宏函数虽然可以在调用函数时直接找到函数的定义"这种描述是不正确的,应该是在预处理阶段函数体替换到函数调用的地方。
45、在C++中,关于下列函数参数的描述中,(   )是正确的。 (得分 0/ 20分)
 A 、 C++语言中,实参是按照自左至右的顺序求值的;
 B 、 若一个参数设置了默认值,则其右边的所有参数都应该具有默认值;
 C 、 函数参数的默认值不允许是表达式;
 D 、 设置参数默认值时,应该全部参数都设置;
问选什么?
答、B,注意函数参数的默认值可以允许是表达式。注意1+3也是表达式。
46、内联函数的内联对编译器来说,只是一个建议,编译器在什么情况下不会将函数进行内联编译?
答、1、不能存在任何形式的循环语句、不能存在过多的条件判断语句、函数体不能过于庞大、不能对函数进行取址操作。
47、struct 和 class有什么区别?
答、①、struct 中不指定成员类型,默认是public,class中默认是private。②、struct中不加继承权限控制时,默认是公有继承,class中默认是private继承。
48、int &&n=3;int &&n=a;问那个可以编译运行成功?
答、int &&n=3可以,但是int &&n=a不可以。
49、问sizeof(e)的大小是什么?
答、引用的变量的大小。
50、问const和#define之间的区别是什么?
答、两个方面1、const 有类型,编译器必须要对其进行安全检查;而#define无类型,不会对其进行安全检查。2、#define的作用域,
默认从定义处到文件结尾,或到宏卸载指令处(而const是有作用域的概念的,如果定义的常量有作用域的要求,#define就不可以使用。
51、如何提高结构体、类的数据的封装性?
答、可以通过函数返回成员数据。避免用户直接使用变量名,若以后数据有修改,改动麻烦。
52、接口最好放在什么文件?
答、头文件。
53、封装的特点?
答、将数据和函数封装在一起;对封装的成员进行访问控制。
54、类的成员权限是怎么区分的?
答、在类的内部,成员没有public、private、protected权限之分;在类的外部才会严格区分权限,即对象会有访问权限设定。
55、类的成员访问权限设计到几个主体?
答、类、子类、对象三个。
56、private权限是什么概念?
答、只能由该类访问,子类和对象都不能访问。
57、protected权限是什么概念?
答、只能由该类和子类访问。
58、public权限是什么概念?
答、可以有本类、子类、对象访问。
59、对象的本质是什么?
答、类数据类型的变量。
60、标识命名的潜在规定(潜规则)?
答、m_name、G_a、P_a;分别标识成员、全局、指针变量。
61、问std在c++什么文件中?
答、std在c++系统文件iostream中。
62、为什么类对象初始化和销毁要提供构造函数和析构函数????
答、因为类对象中存在函数,函数的调用与数据不同,会用到堆栈,所以要引入构造函数和析构函数。
63、简述类对象创建和销毁的过程?
答、对象创建时,先分配内存,再调用构造函数;对象销毁时,先调用析构函数再归还内存。
64、析构函数返回值可以是void吗?
答、不可以。析构函数也没有返回值。
65、析构函数的参数可以设置吗?
答、不可以。
66、构造函数被调用了意味什么?
答、对象一定会产生,对象的内存一定被分配了。一定有一个新的对象产生。
67、一个对象能调用多个构造函数吗?
答、不能。
68、构造函数和析构函数能被重载吗?
答、构造函数可以,析构函数不可以。
69、什么情况下必须要写类的析构函数?
答、只要类的内部使用了指针,而且指针指向了堆内存空间,就必须要写析构函数,并在析构函数中释放堆内存。
70、无参构造函数可称为什么?
答、默认构造函数。
71、有参构造函数可以使用默认构造函数吗?
答、可以。
72、拷贝构造函数的模板是怎样的?拷贝构造函数的参数必须是引用吗,可以是指针吗?
答、Person(const Person &person)
{


}
必须是引用,不能是指针。
73、问
Person person1=Person(10,20);这种写法对吗?
答、对为对象赋值。调用拷贝构造函数
74、问Person person05=10;等价于什么?
答、Person person05=Person(10);注意必须要有与参数类型对应的构造函数。
75、c++头文件<string>中的string是什么?
答、类。
76、类对象如何是匿名的,它有什么特点?如何创建?
答、匿名对象只活在当前行。直接写构造函数就会创建匿名对象。
77、问Person person01;
Person(person01);会报错吗????
答、会,因为第二句不是产生匿名对象,而是创建对象person01,所以会报错。
78、构造函数必须是公有的吗?
答、对。如果是私有的,是不能在类外访问的。所以如果是struct定义类,默认是public,不需要加,如果是class必须要加public。才能写构造函数。
79、问Person p=person;
和Person p;
p=person;有什么区别?
答、第一句是调用拷贝构造函数创建对象;第二句是赋值行为,对象已经创建好了,但等号不是以拷贝的方式赋值,
而是等号赋值的方式。
80、Person CreatePerson()
{
Person person;
cout<<"person:"<<(int)&person<<endl;
return person;


}


void test()
{
Person p=CreatePerson();
}
问这段代码用debug模式和releas(发行)模式编译有什么区别?
答、debug模式会调用拷贝构造函数,p和函数返回的对象是不一样的,拷贝过后,就会释放返回的对象、
release模式不会调用拷贝构造函数,p和函数返回的对象是一样的。
81、编译器优化是什么含义?
答、编译器编译的时候会修改用户代码,进行优化。
82、构造函数如果没写,会不会有构造函数?
答、有,编译器会自动添加。
83、c++编译器至少会默认添加几个函数?
答、默认构造函数、析构函数、拷贝构造函数、赋值函数。但是如果手动添加了拷贝构造函数,编译器就不会
提供默认无参构造函数,也不会提供默认拷贝函数。
如果手添加了非拷贝构造函数,编译器也不会提供默认无参构造函数,但是会提供拷贝构造函数。
84、默认的构造函数特点?默认的析构函数特点?默认的拷贝构造函数的特点?
答、构造和析构什么也不做,但是拷贝构造函数只会进行简单值拷贝(如果有变量指向堆空间,堆空间不拷贝,
会造成浅拷贝问题)。
85、如果类内有堆空间申请,要注意什么?
答、析构函数必须有,且要通过析构函数释放堆空间。
86、默认的类拷贝构造函数是简单的值拷贝,为了解决浅拷贝和深拷贝问题,要如何解决?
答、手动编写深拷贝构造函数。
87、编写类类型的技巧?
答、只要类中出现指针变量,并且指向堆空间,就手动编写析构函数释放堆空间,和拷贝构造函数。
88、类RichPerosn,内有定义类成员bus、car,问定义类RichPrson对象时,构造函数和析构函数是怎样的
(注意此时默认调用对象无参构造函数,不存在有参构造函数)?
答、先调用对象成员bus、car的构造函数,再调用对象RichPerson的构造函数,析构函数与构造函数相反。
89、如果上述bus类定义了有参构造函数,不做处理会不会报错?如何处理?
答、会。在RichPerson类的构造函数编写初始化列表。没有初始化列表,成员类对象调用无参构造函数,如果没有就报错。
90、在c++中int 类型、double类型是不是类?
答、是,可以通过int a(10);double b(23.3)初始化变量。
91、异常的作用?
答、最明显的一点是异常返回的类型比较丰富,如果一个函数需要返回指针类型或int 类型,但是函数返回值是一种类型,
使用异常机制就可以返回这两种类型。
92、问为什么内联函数不能进行异常接口声明?
答、因为异常中异常会往上一个函数抛、如果没有处理还会往再上一个函数抛,如果进行内联,就会影响异常接口的效率。
93、
class A
{
public:
A(int a,int b):_b(b),_a(_b)
{}
void show()
{
cout << "a = " << this->_a << " b = " << this->_b << endl;
}
private:
int _a;
int _b;
};
int main(void)
{
A a(3, 4);
a.show();
return 0;
}则输出结果正确的是( C )。
(20分)
 A 、 a = 4 b = 4
 B 、 a = 3 b = 4
 C 、 a的结果为随机值,b = 4
 D 、 a 和 b 的结果都为随机值
94、
错误 C2679 二进制“<<”: 没有找到接受“std::string”类型的右操作数的运算符(或没有可接受的转换) CheckTest g:\vscode\checktest\checktest\test.cpp 156
问什么原因?
答、没有包含string的系统文件。反而错误地使用了string.h文件。
95、已知Person是一个类,person1是其一个对象,问Person person=person1有没有调用拷贝函数?
答、有调用。可能是默认的(没写的情况下,编译器自动添加),可能是自定义的拷贝构造函数(程序有写)
96、class RichPerson//定义富人类
{
public:
RichPerson(int a, int b) : mBus(b),mCar(a)
{
cout << "RichPerson构造函数" << endl;
}


RichPerson() :mCar(0), mBus(0)
{
cout << "RichPerson 构造函数" << endl;
}


~RichPerson()
{
cout << "RichPerson析构函数" << endl;
}
public:
Bus mBus;
Car mCar;
};
问,RichPerson person(10, 20);构造函数构造过程,析构函数析构过程是怎样的?
答、构造函数先根据public:中成员顺序,即先Bus、后Car确定初始化对象的顺序,再根据构造函数初始化列表进行初始化过程。
析构函数调用顺序是构造函数的逆顺序。
97、什么回调函数?
答、一个函数的参数是函数,这个函数就称为回调函数。
98、vs可不可以设置每次编译时的虚拟地址相同?
答、可以。
99、数据结构的本质是什么?
答、数据间关系的框架。
100、void *称为什么指针?
答、泛型指针。
101、命名空间的作用?
答、主要是防止重名问题。
102、const在c语言和c++中常用用法是什么?
答、在c语言中配合指针作为函数的参数;在c++中配合引用作为函数的参数。
103、const在c++中使用会优化,该功能与define很类似,那么有什么好处?
答、可以进行类型检查,但是define是在预编译时处理,不会进行类型检查。
104、内联函数和宏函数在什么时候调用展开?
答、内联函数是在编译阶段;宏函数是在预处理阶段。
105、c++编译器能自动释放堆内存空间吗?
答、不能。必须手动释放。
106、如果类中有成员指向堆空间,要注意什么?
答、拷贝构造必须手写,赋值构造必须手写,析构函数必须手写,且要考虑堆空间。
107、explicit关键字只能用在什么地方?
答、构造函数。
108、析构函数能不能手动调用?
答、不能。但是构造函数可以。
109、动态对象是什么?
答、在堆中分配对象。
110、用malloc系列函数分配动态对象有什么缺点?如何解决?
答、需要手动调用构造函数,而且成员也不会自动调用构造函数。可以用new功能代替malloc功能,
new关键字分配的动态对象会由编译器代替我们做很多事,包括避免malloc分配的缺点。
111、问malloc创建的动态对象,能不能用delete释放?
答、不一定可以运行。但是编译可以通过。如果涉及到指针,malloc的对象有指针成员分配堆空间,就不能用delete。
因为delete会自动调用析构函数,如果没有申请堆空间(malloc申请对象,需要自己设置构造函数),delete就会执行失败。


112、用new创建的对象有什么特点?
答、分配了内存,并进行了初始化。
113、student *stud=new student[10];


student stu(100);


stud[0]=stu;
问第三句使用了拷贝构造函数还是赋值构造函数?
答、赋值构造函数。
114、void *p=new stduent;
delete p;
问能够执行析构函数吗?
答、不会,delete根据指针类型执行,p的类型是void *,所以析构函数不会执行。
115、问类的静态成员变量和非静态成员变量的区别?
答、静态成员变量是类所有对象公有的。
116、c、c++写的程序和java程序哪个保密性更强?
答、c、c++。
117、生成解决方案错误的分类?
答、编译器、链接器、预编译器
118、class person
{
public:
int mA;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值