C++ 问题与答案
面向对象编程系统。
类是反映实体属性和操作的蓝图。从技术角度来看,定义类就是设计用户定义的数据类型。
类的实例称为对象。
单继承、多继承、多重继承、分层继承和混合继承。
如果类成员是 protected,则可以在继承的类中访问它。但是,私有成员和受保护成员在类外部都是不可访问的。
将数据和作用于数据的函数绑定到一个实体(类)中的过程称为封装。
抽象是指隐藏内部实现,仅展示必要的细节。
继承是将现有类的属性获取到新类中的过程。现有类称为基类/父类,继承的类称为派生类/子类。
将变量声明为 volatile 会告知编译器该变量可以从外部更改。从而避免了编译器对变量引用的优化。
在函数定义前添加关键字 inline 前缀的函数被称为内联函数。与普通函数相比,内联函数的执行速度更快,因为编译器将内联函数视为宏。
存储类指定符号(例如变量或函数)的生命周期或作用域。
以下是 C++ 支持的存储类
auto、static、extern、register 和 mutable
可以使用可变存储类说明符声明常量类对象的成员变量来更改它。仅适用于类的非静态和非常量成员变量。
浅拷贝是将内存逐位从一个对象转储到另一个对象。深拷贝是将一个对象中的字段逐个复制到另一个对象。深层复制是通过复制构造函数和/或重载赋值运算符实现的。
没有函数体且赋值为零的虚函数称为纯虚函数。
至少包含一个纯虚函数的类称为抽象类。抽象类无法实例化。
引用变量是现有变量的别名。这意味着变量名和引用变量指向同一内存位置。因此,也可以使用引用变量来更新原始变量。
即使未创建相应类的对象,静态变量也存在。静态成员变量与为相应类创建的所有对象共享一块内存。静态成员变量可以通过类名本身来引用。
静态成员函数可以在类对象存在之前使用类名来调用,因为它已经存在。它只能访问类的静态成员。
wchar_t
点 (.) 和箭头 ( -> )
不可以,定义类/结构体只是类型定义,不会为其分配内存。
bool 是 C++ 语言中引入的新原始数据类型。
定义多个具有相同名称且参数列表不同的函数称为函数重载。
为类对象中现有的运算符定义一个新的任务称为运算符重载。
没有,它是 STL(标准模板库)中的一个类。
cin、cout、cerr 和 clog。
Private &受保护。
作用域解析运算符 (::)
析构函数是类的成员函数,其名称与类名相同,并以波浪号 (~) 为前缀。一旦对象失去其作用域,它将自动针对该对象执行。它不能重载,唯一的形式是无参数。
构造函数是类的成员函数,它与类名相同,并在创建相应类的对象时自动执行。
如果程序员没有提供构造函数,编译器会为每个类提供一个默认构造函数。程序员提供的无参数构造函数称为默认构造函数。在这种情况下,编译器不会提供构造函数。
new 运算符可以用于分配动态内存。
delete 运算符用于释放使用 new 运算符创建的动态内存。
是的,因为 C 是 C++ 的子集,所以我们也可以在 C++ 中使用 C 的所有函数。
不可以,我们需要使用 C 语言的 free() 函数。
一个函数不是类的成员函数,但仍然可以访问类的所有成员。为了实现这一点,我们需要在所需的类中声明它,并在关键字 friend 之后进行声明。
复制构造函数是接受同一类对象引用作为参数的构造函数。在创建对象时,只要使用同一类的另一个对象初始化该对象,就会自动调用复制构造函数。
C++ 支持异常处理。try、catch 和throw 是用于相同操作的关键字。
This 是编译器的指针变量,它始终保存当前活动对象的地址。
默认情况下,struct 的成员是公有的,而 class 的成员是私有的。
可以。
变量的作用域仅在块内有效。 C++ 中的变量也可以在块中的任何位置声明。
如果文件已存在,则在打开文件之前会截断其内容。
作用域解析运算符用于
- 解析全局变量的作用域。
- 如果函数在类外部定义,则将函数定义与类关联。
A命名空间是代码的逻辑划分,可以通过将标识符放在不同的命名空间下来解决标识符的名称冲突。
从命令行/控制台执行时发送给 main() 函数的参数/形参被称为命令行参数。所有发送的参数都只是字符串。
模板类是一种泛型类。关键字 template 可用于定义类模板。
带省略号的 catch 块如下所示
catch() { }
默认情况下,函数的每个局部变量都是自动变量 (auto)。在下面的函数中,变量 i 和 j 都是自动变量。
void f() { int i; auto int j; }
注意 − 全局变量不能是自动变量。
静态局部变量在函数调用期间会保留其值,默认值为 0。以下函数如果被调用三次,将打印 1 2 3。
void f() { static int i; ++i; printf(%d ,i); }
如果全局变量是静态的,则其可见性仅限于同一源代码。
用于解析全局符号的作用域
#include <iostream> using namespace std; main() { extern int i; cout<<i<<endl; } int i = 20;
数组的起始地址称为数组的基址。
如果一个变量使用频率最高,那么应该使用寄存器存储说明符声明它,这样编译器可能会为它分配一个 CPU 寄存器来存储,以加快变量的查找速度。
可以,但不能执行,因为执行需要 main() 函数的定义。
默认情况下,每个局部变量都是自动变量,存储在堆栈内存中
如果一个类包含至少一个其他类类型的成员变量,则称其为容器类。
C++ 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串字面量或符号。
预处理器是指示编译器在实际编译过程之前执行某些操作的指令。开始。
我们在执行程序时传递给 main() 函数的参数被称为命令行参数。这些参数始终是字符串,保存在函数的第二个参数(见下文的 args 部分)中,该参数是一个字符指针数组。第一个参数表示参数的数量(见下文的 count 部分),并由操作系统自动更新。
main( int count, char *args[]) { }
按值调用 − 我们仅将值作为参数传递给函数。如果我们不想使用形式参数修改实际参数,而只是使用实际参数,则选择这种方式。
按地址调用 − 我们发送实际参数的地址而不是值。如果我们确实希望使用形式参数修改实际参数,则选择这种方式。
按引用调用 − 实际参数通过 C++ 新的引用变量作为形式参数接收。如果我们确实希望用形式参数修改实际参数,则选择此选项。
错误,模运算符 (%) 的两个操作数不能是实数,这是无效的。
将选项 lm 用作 > g++ lm <file.cpp>
不可以,没有这样的规定。
Bjarne Stroustrup。
sizeof
我们可以将作用域解析运算符 (::) 应用于全局变量的作用域。
指针上唯一允许的两种操作是
比较 ii) 加法/减法(不包括 void 指针)
函数调用自身被称为递归。
程序名称。
理想情况下,它是 32 个字符,并且取决于具体实现。
默认情况下,函数是按值调用的。
公共、私有和受保护
Delete[] 用于释放使用 new[] 分配的数组内存,而 delete 用于释放使用 new 分配的一块内存。
不一定,至少包含一个纯虚函数的类也是抽象类。
不合法,这会引发错误,因为编译器无法进行转换。
程序会突然退出。
不合法,异常可以被处理,而程序无法解决错误。
在基类和派生类中定义具有相同签名和名称的函数,其中基类函数是虚函数。
seekg()
seekp()
否,只有类成员变量决定相应类对象的大小。
我们可以创建一个空类,对象大小为 1。
C++ 定义的默认命名空间。
标准模板库
cout 是 ostream 类的对象。流 cout 默认连接到控制台输出设备。
cin 是 istream 类的对象。默认情况下,cin 流连接到控制台输入设备。
它用于指定所使用的命名空间。
箭头 (->) 运算符也可用于此目的
如果使用 < > 包含头文件那么编译器只会在内置包含路径中搜索特定的头文件。如果头文件包含在 中,则编译器首先在当前工作目录中搜索特定的头文件,如果未找到,则在内置包含路径中搜索。
S++,因为它内部是单条机器指令 (INC)。
在调用端发送给函数的参数称为实际参数,而在函数定义接收端,称为形式参数。
声明将类型与变量关联,而定义将值赋给变量。
转到。
不是,它包含无效的八进制数字。
它将用于取消定义现有的宏定义。
不可以。
虚拟析构函数确保对象资源的释放顺序与继承对象的构造顺序相反。
对象销毁的顺序与创建顺序相反。
通过在目标类中以关键字 friend 为前缀的类声明,类成员可以获得对其他类成员的访问权。