C++经典41问(2个小时快速掌握C++)
Posted cui_yonghua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++经典41问(2个小时快速掌握C++)相关的知识,希望对你有一定的参考价值。
1. 简单介绍一下C++
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持面向过程编程、面向对象编程和泛型编程。
C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。
C++ 是由 Bjarne Stroustrup(C++之父) 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。
C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。
2. C++支持面向对象设计吗?
C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:封装
、抽象、继承、多态
3. C++由哪些部分组成?
标准的 C++ 由三个重要部分组成:
核心语言
,提供了所有构件块,包括变量、数据类型和常量,等等。C++ 标准库
,提供了大量的函数,用于操作文件、字符串等。标准模板库(STL)
,提供了大量的方法,用于操作数据结构等。
4. 什么是ANSI 标准?
ANSI 标准是为了确保 C++ 的便携性 —— 您所编写的代码在 Mac、UNIX、Windows、Alpha 计算机上都能通过编译。
由于 ANSI 标准已稳定使用了很长的时间,所有主要的 C++ 编译器的制造商都支持 ANSI 标准。
5. 你是如何理解和学习 C++的?
学习 C++,关键是要理解概念,而不应过于深究语言的技术细节。
学习程序设计语言的目的是为了成为一个更好的程序员,也就是说,是为了能更有效率地设计和实现新系统,以及维护旧系统。
C++ 支持多种编程风格。您可以使用 Fortran、C、Smalltalk 等任意一种语言的编程风格来编写代码。每种风格都能有效地保证运行时间效率和空间效率。
6. C++主要用来做什么?
基本上每个应用程序领域的程序员都有使用 C++。
- C++ 通常用于编写设备驱动程序和其他要求实时性的直接操作硬件的软件。
- C++ 广泛用于教学和研究。
- 任何一个使用苹果电脑或 Windows PC 机的用户都在间接地使用 C++,因为这些系统的主要用户接口是使用 C++ 编写的。
7. 什么是源文件,C++源文件的拓展名有哪些?
通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。
8 什么是编译器,C++常用的编译器是什么?
写在源文件中的源代码是人类可读的源。它需要"编译",转为机器语言,这样 CPU 可以按给定指令执行程序。C++ 编译器用于把源代码编译成最终的可执行程序。
最常用的免费可用的编译器是 GNU 的 C/C++ 编译器,主要是因为 GNU 的 gcc 编译器适合于 C 和 C++ 编程语言。
检查系统上是否安装了 GCC:
g++ -v
注,编译器的安装可参考:
UNIX/Linux 上的安装:http://gcc.gnu.org/install/
Mac OS X 上的安装:https://developer.apple.com/technologies/tools/
Windows 上的安装:https://www.mingw.org
9. 什么是类、对象,方法、即时变量?
- 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。
- 类 - 类可以定义为描述对象行为/状态的模板/蓝图。
- 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。
- 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。
10. 编译 & 执行 C++ 程序有哪些步骤?
#include <iostream>
using namespace std;
int main()
cout << "Hello World";
return 0;
简单的步骤:
1、打开一个文本编辑器,添加上述代码。
2、保存文件为 hello.cpp。
3、打开命令提示符,进入到保存文件所在的目录。
4、键入 g++ hello.cpp
,输入回车,编译代码。如果代码中没有错误,命令。
5、提示符会跳到下一行,并生成 a.out 可执行文件。
6、现在,键入 ./a.out
来运行程序。就可以看到终端屏幕上显示 ’ Hello World '。
执行如下:
$ g++ hello.cpp
$ ./a.out
Hello World
11. 怎么理解C++ 中的分号 和 块
在 C++ 中:
- 分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
- 块是一组使用大括号括起来的按逻辑连接的语句。
12. 什么是标识符,C++是怎么规定标识符的?
标识符
是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C++ 标识符内不允许出现标点字符
,比如 @、$ 和 %。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。
13. 基本的 C++ 数据类型有哪些?
C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。七种基本的 C++ 数据类型:
布尔型 bool
:存储值 true 或 false。字符型 char
:通常是一个八位字节(一个字节)。这是一个整数类型。整型 int
:对机器而言,整数的最自然的大小。浮点型 float
:单精度浮点值。双浮点型 double
:双精度浮点值。无类型 void
:表示类型的缺失。宽字符型 wchar_t
:宽字符类型。
一些基本类型可以使用一个或多个类型修饰符进行修饰:signed
、unsigned
、short
、long
注:变量的大小会根据编译器和所使用的电脑而有所不同。下面实例会输出电脑上各种数据类型的大小。
#include <iostream>
using namespace std;
int main()
// // endl是将在每一行后插入一个换行符,sizeof() 函数来获取各种数据类型的大小
cout << "Size of char : " << sizeof(char) << endl;
cout << "Size of int : " << sizeof(int) << endl;
cout << "Size of short int : " << sizeof(short int) << endl;
cout << "Size of long int : " << sizeof(long int) << endl;
cout << "Size of float : " << sizeof(float) << endl;
cout << "Size of double : " << sizeof(double) << endl;
cout << "Size of wchar_t : " << sizeof(wchar_t) << endl;
return 0;
C++ 也允许定义各种其他类型的变量,比如枚举、指针、数组、引用、数据结构、类等等
14. 什么是typedef 声明?
您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:
typedef type newname;
例如,下面的语句会告诉编译器,feet 是 int 的另一个名称:
typedef int feet;
现在,下面的声明是完全合法的,它创建了一个整型变量 distance:
feet distance;
15. 什么是枚举类型?举例说明
枚举类型声明一个可选的类型名称和一组标识符,用来作为该类型的值。其带有零个或多个标识符可以被用来作为该类型的值。每个枚举数是一个枚举类型的常数。
创建枚举,需要使用关键字 enum。枚举类型的一般形式为:
enum enum-name list of names var-list;
enum-name 是枚举类型的名称。名称列表 list of names 是用逗号分隔的。
例如,下面的代码定义了一个颜色枚举,变量 c 的类型为 color。最后,c 被赋值为 “blue”。
enum color red, green, blue c;
c = blue;
默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。例如,在下面的枚举中,green 的值为 5。
enum color red, green=5, blue ;
在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1。
16. 怎么理解C++ 中的变量定义和变量声明
变量定义:
就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表。下面列举几个实例:
extern int d = 3, f = 5; // d 和 f 的声明
int d = 3, f = 5; // 定义并初始化 d 和 f
byte z = 22; // 定义并初始化 z
char x = 'x'; // 变量 x 的值为 'x'
变量声明:
向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。可以使用 extern 关键字在任何地方声明一个变量。
虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。下面的实例,其中,变量在头部就已经被声明,但它们是在主函数内被定义和初始化的:
#include <iostream>
using namespace std;
// 变量声明
extern int a, b;
extern int c;
extern float f;
int main ()
// 变量定义
int a, b;
int c;
float f;
// 实际初始化
a = 10;
b = 20;
c = a + b;
cout << c << endl ;
f = 70.0/3.0;
cout << f << endl ;
return 0;
当上面的代码被编译和执行时,它会产生下列结果:
30
23.3333
17. 怎么理解C++ 中的左值(Lvalues)和右值(Rvalues)
C++ 中有两种类型的表达式:
左值(lvalue)
:指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。右值(rvalue)
:术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。如:
一个有效的语句:int g = 20;
一个无效的语句:10 = 20;
,会生成编译时错误。
18. 什么是作用作用域?哪些地方可以声明变量?
作用域是程序的一个区域,一般来说有三个地方可以声明变量:
- 在函数或一个代码块内部声明的变量,称为
局部变量
。 - 在函数参数的定义中声明的变量,称为
形式参数
。 - 在所有函数外部声明的变量,称为
全局变量
。
19. 什么是常量?
常量是固定值
,在程序执行期间不会改变。这些固定的值,又叫做字面量。常量可以是任何的基本数据类型
,可分为整型数字、浮点数字、字符、字符串和布尔值。常量就像是常规的变量
,只不过常量的值在定义后不能进行修改。
20. 整数常量可以是哪些形式?
整数常量 可以是十进制、八进制或十六进制的常量
。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量 也可以带一个后缀,后缀是 U 和 L 的组合
,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
下面列举几个整数常量的实例:
212 // 合法的
215u // 合法的
0xFeeL // 合法的
078 // 非法的:8 不是八进制的数字
032UU // 非法的:不能重复后缀
以下是各种类型的整数常量的实例:
85 // 十进制
0213 // 八进制
0x4b // 十六进制
30 // 整数
30u // 无符号整数
30l // 长整数
30ul // 无符号长整数
21. C++的修饰符类型有哪些?
数据类型修饰符有:signed、unsigned、long、short
- 修饰符 signed、unsigned、long 和 short 可应用于整型,
- signed 和 unsigned 可应用于字符型,
- long 可应用于双精度型。
22. 类型限定符有哪些?
类型限定符提供了变量的额外信息。
const
const 类型的对象在程序执行期间不能被修改改变。volatile
修饰符 volatile 告诉编译器,变量的值可能以程序未明确指定的方式被改变。restrict
由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。
23. C++ 程序中可用的存储类有哪些?
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:
auto
:auto 存储类是所有局部变量默认的存储类。
register
:register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。
static
:static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。
使用 static 修饰局部变量时,可以在函数调用之间保持局部变量的值。
使用 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
extern
:extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候
mutable
:它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。
24. C++的类型的运算符有哪些?
C++ 内置了丰富的运算符,并提供了以下类型的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
25. 怎么理解函数声明和函数定义
函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat()
用来连接两个字符串,函数 memcpy()
用来复制内存到另一个位置。
函数还有很多叫法,比如方法、子例程或程序,等等。
26. 传值调用、指针调用和引用调用的区别?
传值调用
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
指针调用
该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
引用调用
该方法把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
默认情况下,C++ 使用传值调用来传递参数。
27. C++ 中有用的内置的数学函数有哪些?
C++ 内置了丰富的数学函数,可对各种数字进行运算。需要引用数学头文件 。如:
#include <iostream>
#include <cmath>
using namespace std;
int main ()
// 数字定义
short s = 10;
int i = -1000;
long l = 100000;
float f = 230.47;
double d = 200.374;
// 数学运算
cout << "sin(d) :" << sin(d) << endl;
cout << "abs(i) :" << abs(i) << endl;
cout << "floor(d) :" << floor(d) << endl;
cout << "sqrt(f) :" << sqrt(f) << endl;
cout << "pow( d, 2) :" << pow(d, 2) << endl;
return 0;
当上面的代码被编译和执行时,它会产生下列结果:
sign(d) :-0.634939
abs(i) :1000
floor(d) :200
sqrt(f) :15.1812
pow( d, 2 ) :40149.7
28. C++随机数需要用到哪些函数?
关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。
下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main ()
int i,j;
// 设置种子
srand( (unsigned)time( NULL ) );
/* 生成 5 个随机数 */
for( i = 0; i < 5; i++ )
// 生成实际的随机数
j= rand();
cout <<"随机数: " << j << endl;
return 0;
当上面的代码被编译和执行时,它会产生下列结果:
随机数: 68430273
随机数: 1203847166
随机数: 1615880575
随机数: 1026624063
随机数: 1587006843
29. 数组初始化及访问
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
案例:声明数组、数组赋值、访问数组:
#include <iostream>
using namespace std;
#include <iomanip>
using std::setw;
int main ()
int n[ 10 ]; // n 是一个包含 10 个整数的数组
// 初始化数组元素
for ( int i = 0; i < 10; i++ )
n[ i ] = i + 100; // 设置元素 i 为 i + 100
cout << "Element" << setw( 13 ) << "Value" << endl;
// 输出数组中每个元素的值
for ( int j = 0; j < 10; j++ )
cout << setw( 7 )<< j << setw( 13 ) << n[ j ] << endl;
return 0;
上面的程序使用了 setw() 函数来格式化输出。当上面的代码被编译和执行时,它会产生下列结果:
Element Value
0 100
1 101
2 102
3 103
4 104
5 105
6 106
7 107
8 108
9 109
30. C++字符串表示形式有哪些?
C++ 提供了以下两种类型的字符串表示形式:
- C 风格字符串
- C++ 引入的 string 类类型
31. C++ 中的 String 类类型有哪些方法
C++ 标准库提供了 string 类类型,可以复制,连接,查看字符串长度等。
#include <iostream>
#include <string>
using namespace std;
int main ()
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;
// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl;
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
当上面的代码被编译和执行时,它会产生下列结果:
str3 : Hello
str1 + str2 : HelloWorld
str3.size() : 10
32. 什么是指针?
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var-name;
在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
33. C++ 中使用指针需要进行的操作
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。
这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:
#include <iostream>
using namespace std;
int main ()
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl;
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl;
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
当上面的代码被编译和执行时,它会产生下列结果:
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20
34. C++ 引用是什么?
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
35. C++ 引用 和 指针的区别?
引用很容易与指针混淆,它们之间有三个主要的不同:
不存在空引用
。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
引用必须在创建时被初始化。指针可以在任何时间被初始化
。
36. C++ 中怎么创建引用?
可以通过原始变量名称或引用来访问变量的内容。例如:
在这些声明中,& 读作引用。因此,
第一个声明可以读作 “r 是一个初始化为 i 的整型引用
”,
第二个声明可以读作 “s 是一个初始化为 d 的 double 型引用
”。引用通常用于函数参数列表和函数返回值。下面的实例使用了 int 和 double 引用:
#include <iostream>
using namespace std;
int main ()
// 声明简单的变量
int i;
double d;
// 声明引用变量
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0;
当上面的代码被编译和执行时,它会产生下列结果:
Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7
37. C++ 日期 & 时间 处理
C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 头文件。
有四个与时间相关的类型:clock_t、time_t、size_t 和 tm。类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。
结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:
struct tm
int tm_sec; // 秒,正常范围从 0 到 59,但允许至 61
int tm_min; // 分,范围从 0 到 59
int tm_hour; // 小时,范围从 0 到 23
int tm_mday; // 一月中的第几天,范围从 1 到 31
int tm_mon; // 月,范围从 0 到 11
int tm_year; // 自 1900 年起的年数
int tm_wday; // 一周中的第几天,范围从 0 到 6,从星期日算起
int tm_yday; // 一年中的第几天,范围从 0 到 365,从 1 月 1 日算起
int tm_isdst; // 夏令时
tm 结构在 C/C++ 中处理日期和时间相关的操作时,显得尤为重要。tm 结构以 C 结构的形式保存日期和时间。大多数与时间相关的函数都使用了 tm 结构。下面的实例使用了 tm 结构和各种与日期和时间相关的函数。
#include <iostream>
#include <ctime>
using namespace std;
int main()
// 基于当前系统的当前日期/时间
time_t now = time(0);
cout << "1970年1月1日到目前经过的秒数:" << now << endl;
tm *ltm = localtime(&now);
// 输出 tm 结构的各个组成部分
cout << "年: "<< 1900 + ltm->tm_year << endl;
cout << "月: "<< 1 + ltm->tm_mon<< endl;
cout << "日: "<< ltm->tm_mday << endl;
cout << "时间: "<< 1 + ltm->tm_hour << ":";
cout << 1 + ltm->tm_min << ":";
cout << 1 + ltm->tm_sec << endl;
当上面的代码被编译和执行时,它会产生下列结果:
1970年1月1日到目前经过的秒数:1524456057
年: 2018
月: 4
日: 23
时间: 5:1:58
38. 常见的 I/O 操作有哪些?
C++ 标准库提供了一组丰富的输入/输出功能:
输入操作
:C++ 的 I/O 发生在流中,流是字节序列。如果字节流是
以上是关于C++经典41问(2个小时快速掌握C++)的主要内容,如果未能解决你的问题,请参考以下文章
手把手写C++服务器(17):自测!TCP协议面试经典十连问