摘要: # 108.如何设计一个计算仅单个子类的对象个数? 1.为类设计一个static静态变量count作为计数器; 2.类定义结束后初始化count; 3.在构造函数中对count进行+1; 4.设计拷贝构造函数,在进行拷贝构造函数中进行count +1,操作; 5.设计赋值构造函数,在进行赋值函数中对 阅读全文
posted @ 2023-07-11 15:51 CodeMagicianT 阅读(116) 评论(0) 推荐(0)
摘要: # 107.你知道静态绑定和动态绑定吗?讲讲? 1.对象的静态类型:对象在声明时采用的类型。是在编译期确定的。 2.对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。 3.静态绑定:绑定的是对象的静态类型,某特性(比如函数依赖于对象的静态类型,发生在 阅读全文
posted @ 2023-07-11 15:50 CodeMagicianT 阅读(36) 评论(0) 推荐(0)
摘要: # 106.你什么情况用指针当参数,什么时候用引用,为什么? ## 1.使用引用参数的主要原因有两个 1.程序员能修改调用函数中的数据对象 2.通过传递引用而不是整个数据–对象,可以提高程序的运行速度 ## 2.一般的原则 1.对于使用引用的值而不做修改的函数: (1)如果数据对象很小,如内置数据类 阅读全文
posted @ 2023-07-11 15:50 CodeMagicianT 阅读(116) 评论(0) 推荐(0)
摘要: # 105.你知道const char* 与string之间的关系是什么吗? 1.string 是C++标准库里面其中一个,封装了对字符串的操作,实际操作过程我们可以用const char*给string类初始化 2.三者的转化关系如下所示: ```C++ a) string转const char* 阅读全文
posted @ 2023-07-11 15:50 CodeMagicianT 阅读(202) 评论(0) 推荐(0)
摘要: # 104.C++中标准库是什么? ## 1.C++ 标准库可以分为两部分: 1.1标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。 输入/输出 I/O、字符串和字符处理、数学、时间、日期和本地化、动态分配、其他、宽字符函数 ``` * 输入输出流:`` 头 阅读全文
posted @ 2023-07-11 15:49 CodeMagicianT 阅读(94) 评论(0) 推荐(0)
摘要: # 103.如果有一个空类,它会默认添加哪些函数? ```C++ 1) Empty(); // 缺省构造函数// 2) Empty( const Empty& ); // 拷贝构造函数// 3) ~Empty(); // 析构函数// 4) Empty& operator=( const Empty 阅读全文
posted @ 2023-07-11 15:49 CodeMagicianT 阅读(40) 评论(0) 推荐(0)
摘要: # 102.volatile关键字的作用? volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int vo 阅读全文
posted @ 2023-07-11 15:48 CodeMagicianT 阅读(116) 评论(0) 推荐(0)
摘要: # 101.程序在执行int main(int argc, char *argv[])时的内存结构,你了解吗? 参数的含义是程序在命令行下运行的时候,需要输入argc 个参数,每个参数是以char 类型输入的,依次存在数组里面,数组是 argv[],所有的参数在指针char * 指向的内存中,数组的 阅读全文
posted @ 2023-07-11 15:42 CodeMagicianT 阅读(50) 评论(0) 推荐(0)
摘要: # 100.你知道strcpy和memcpy的区别是什么吗? 1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根 阅读全文
posted @ 2023-07-11 15:38 CodeMagicianT 阅读(566) 评论(0) 推荐(0)
摘要: # 99.如何在不使用额外空间的情况下,交换两个数?你有几种方法 ```C++ 1) 算术 x = x + y; y = x - y; x = x - y; 2) 异或 x = x^y;// 只能对int,char.. y = x^y; x = x^y; x ^= y ^= x; ``` 参考资料来 阅读全文
posted @ 2023-07-11 15:37 CodeMagicianT 阅读(61) 评论(0) 推荐(0)
摘要: # 98.C++如何处理多个异常的? 1. C++中的异常情况: 语法错误(编译错误):比如变量未定义、括号不匹配、关键字拼写错误等等编译器在编译时能发现的错误,这类错误可以及时被编译器发现,而且可以及时知道出错的位置及原因,方便改正。 运行时错误:比如数组下标越界、系统内存不足等等。这类错误不易被 阅读全文
posted @ 2023-07-11 15:37 CodeMagicianT 阅读(149) 评论(0) 推荐(0)
摘要: # 97.隐式转换,如何消除隐式转换? 1.C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的。所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。很多时候用户可能都不知道进行了哪些转换 2.C++面向对象的多态特性,就是通过父类的类型实现对子类的封装。通过隐式转换, 阅读全文
posted @ 2023-07-11 15:35 CodeMagicianT 阅读(911) 评论(0) 推荐(0)
摘要: # 96.说一下你理解的 ifdef endif代表着什么? 1.一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 2. 阅读全文
posted @ 2023-07-11 15:33 CodeMagicianT 阅读(105) 评论(0) 推荐(0)
摘要: # 95.静态成员与普通成员的区别是什么? 1.生命周期 静态成员变量从类被加载开始到类被卸载,一直存在; 普通成员变量只有在类创建对象后才开始存在,对象结束,它的生命期结束; 2.共享方式 静态成员变量是全类共享;普通成员变量是每个对象单独享用的; 3.定义位置 普通成员变量存储在栈或堆中,而静态 阅读全文
posted @ 2023-07-11 15:33 CodeMagicianT 阅读(106) 评论(0) 推荐(0)
摘要: # 94.全局变量和static变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 全局变量和局部变量主要在作用域、定义位置、内存存储方式、生命期以及使用方式上存在明显的区别。 1.作用 阅读全文
posted @ 2023-07-11 15:33 CodeMagicianT 阅读(582) 评论(0) 推荐(0)
摘要: # 93.定义和声明的区别 **如果是指变量的声明和定义:** 从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。 **如果是指函数的声明和定义:** 声明:一般在头文件里,对编译器说:这里有一个函数叫function() 让编 阅读全文
posted @ 2023-07-11 15:32 CodeMagicianT 阅读(117) 评论(0) 推荐(0)
摘要: # 92.当程序中有函数重载时,函数的匹配原则和顺序是什么? 多数情况下,我们可以很容易的判断出该会调用哪一个重载函数,例如,调用的重载函数之间形参数量不同,形参的类型有明显的区别等。但是,当几个重载函数形参数量相等、具有默认形参以及形参又可以发生类型转换时,判断会调用哪个重载函数就显得不那么明了。 阅读全文
posted @ 2023-07-11 15:32 CodeMagicianT 阅读(337) 评论(0) 推荐(0)
摘要: # 91.你知道重载运算符吗? 1.我们只能重载已有的运算符,而无权发明新的运算符;对于一个重载的运算符,其优先级和结合律与内置类型一致才可以;不能改变运算符操作数个数; 2.两种重载方式:成员运算符和非成员运算符,成员运算符比非成员运算符少一个参数;下标运算符、箭头运算符必须是成员运算符; 3.引 阅读全文
posted @ 2023-07-11 15:32 CodeMagicianT 阅读(97) 评论(0) 推荐(0)
摘要: # 90.cout和printf有什么区别? `cout` 和 `printf` 是 C++ 和 C语言中用于输出信息的函数,它们有以下区别: 1. 语法和用法: - `cout` 是 C++ 中的输出流对象,可以使用流操作符 `和basic_ostream。实现了char,wchar_t具体化;i 阅读全文
posted @ 2023-07-11 15:31 CodeMagicianT 阅读(938) 评论(0) 推荐(0)
摘要: # 89.C++中类成员的访问权限和继承权限问题 - public的变量和函数在类的内部外部都可以访问。 - protected的变量和函数只能在类的内部和其派生类中访问。 - private修饰的元素只能在类内访问 派生类可以继承基类中除了构造/析构、赋值运算符重载函数之外的成员,这些成员的访问属 阅读全文
posted @ 2023-07-11 15:27 CodeMagicianT 阅读(441) 评论(0) 推荐(0)
摘要: # 88.为什么模板类一般都是放在一个h文件中 1.模板定义很特殊。由template处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。 所以为了容易使用,几乎总是在头文件中放置全部的模板声明和 阅读全文
posted @ 2023-07-11 15:25 CodeMagicianT 阅读(225) 评论(0) 推荐(0)
摘要: # 87.你知道printf函数的实现原理是什么吗? printf是[格式化输出](https://so.csdn.net/so/search?q=格式化输出&spm=1001.2101.3001.7020)可以自己定义输出的格式;printf(“%d\n”,a),其中" "之间的是格式说明串。% 阅读全文
posted @ 2023-07-11 15:25 CodeMagicianT 阅读(595) 评论(0) 推荐(0)
摘要: # 86.define、const、typedef、inline的使用方法?他们之间有什么区别? 一、const与#define的区别: 1. const定义的常量是变量带类型,而#define定义的只是个常数不带类型; 2. define只在预处理阶段起作用,简单的文本替换,而const在编译、链 阅读全文
posted @ 2023-07-11 15:24 CodeMagicianT 阅读(173) 评论(0) 推荐(0)
摘要: # 85.函数调用过程栈的变化,返回值和参数变量哪个先入栈? 1.将函数的参数压入栈中。参数的压入顺序与调用约定有关,可以是从右到左,也可以是从左到右。而在大多数C/C++编译器中,在函数调用的过程中,函数的参数是 ***\*由右向左\****入栈的; 2.将当前函数的返回地址压入栈中。返回地址是指 阅读全文
posted @ 2023-07-11 15:19 CodeMagicianT 阅读(811) 评论(0) 推荐(0)
摘要: # 84.结构体变量比较是否相等 ## 1.重载了 “==” 操作符 ```C++ #include using namespace std; struct foo { int a; int b; foo(int a, int b) { this->a = a; this->b = b; } // 阅读全文
posted @ 2023-07-11 15:19 CodeMagicianT 阅读(795) 评论(0) 推荐(0)
摘要: # 83.说一说你理解的内存对齐以及原因 ## 1.什么是内存对齐?? 内存对齐可以提高CPU的内存访问效率,因为CPU在读取内存时是按照一块一块的方式进行读取,每块的大小由内存读取粒度确定,通常为2、4、8或16个字节。 1.硬件存储和读取 一个内存是由若干个黑色的内存颗粒构成的。每一个内存颗粒叫 阅读全文
posted @ 2023-07-11 15:18 CodeMagicianT 阅读(157) 评论(0) 推荐(0)
摘要: # 82.函数指针? 函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如: ```C++ //比较两个string对象的长度 bool lengthCompare(const string&, const strin 阅读全文
posted @ 2023-07-11 15:17 CodeMagicianT 阅读(56) 评论(0) 推荐(0)
摘要: # 81.知道C++中的组合吗?它与继承相比有什么优缺点吗? ## 1.继承 继承是Is a 的关系,比如说Student继承Person,则说明Student is a Person。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。 继承的缺点有以下几点: ①父类的内部细节对子类是可见 阅读全文
posted @ 2023-07-11 15:16 CodeMagicianT 阅读(100) 评论(0) 推荐(0)
摘要: # 80.继承机制中对象之间如何转换?指针和引用之间如何转换? ## 1.向上类型转换 将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。 ## 2.向下类型转换 将基类指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不会自 阅读全文
posted @ 2023-07-11 15:16 CodeMagicianT 阅读(74) 评论(0) 推荐(0)
摘要: # 79.如果想将某个类用作基类,为什么该类必须定义而非声明? 派生类中包含并且可以使用它从基类继承而来的成员,为了使用这些成员,派生类必须知道他们是什么。 所以必须定义而非声明。 参考资料来源: 阿秀 阅读全文
posted @ 2023-07-11 15:16 CodeMagicianT 阅读(52) 评论(0) 推荐(0)
摘要: # 78.类如何实现只能静态分配和只能动态分配 1.前者是把new、delete运算符重载为private属性。后者是把构造、析构函数设为protected属性,再用子类来动态创建 2.建立类的对象有两种方式: ① 静态建立,例如 A a; 静态建立一个类对象,就是由编译器为对象在栈空间中分配内存。 阅读全文
posted @ 2023-07-11 15:15 CodeMagicianT 阅读(163) 评论(0) 推荐(0)
摘要: # 77.C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗? 1.指针参数传递本质上是值传递,它所传递的是一个地址值。 值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。 值传递的特点是 阅读全文
posted @ 2023-07-11 15:15 CodeMagicianT 阅读(132) 评论(0) 推荐(0)
摘要: # 76.方法调用的原理(栈,汇编) 1.机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。而为单个过程分配的那部分栈称为帧栈;帧栈可以认为是程序栈的一段,它有两个端点,一个标识起始地址,一个标识着结束地址,两个指针结束地址指针esp,开始地址指针ebp; 2.由一系列栈帧 阅读全文
posted @ 2023-07-11 15:15 CodeMagicianT 阅读(82) 评论(0) 推荐(0)
摘要: # 75.怎样判断两个浮点数是否相等? 对两个浮点数判断大小和是否相等不能直接用==来判断,会出错!明明相等的两个数比较反而是不相等!对于两个浮点数比较只能通过相减并与预先设定的精度比较,记得要取绝对值!浮点数与0的比较也应该注意。与浮点数的表示方式有关。 参考资料来源: 阿秀 阅读全文
posted @ 2023-07-11 15:14 CodeMagicianT 阅读(125) 评论(0) 推荐(0)
摘要: # 74.指针加减计算要注意什么? 指针加减本质是对其所指地址的移动,移动的步长跟指针的类型是有关系的,因此在涉及到指针加减运算需要十分小心,加多或者减多都会导致指针指向一块未知的内存地址,如果再进行操作就会很危险。 举个例子: ```C++ #include using namespace std 阅读全文
posted @ 2023-07-11 15:14 CodeMagicianT 阅读(75) 评论(0) 推荐(0)
摘要: # 73.全局变量和局部变量有什么区别? C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 全局变量和局部变量主要在作用域、定义位置、内存存储方式、生命期以及使用方式上存在明显的区别。 1.作用域 阅读全文
posted @ 2023-07-11 15:14 CodeMagicianT 阅读(544) 评论(0) 推荐(0)
摘要: # 72.引用是否能实现动态绑定,为什么可以实现? 可以。 引用在创建的时候必须初始化,在访问虚函数时,编译器会根据其所绑定的对象类型决定要调用哪个函数。注意只能调用虚函数。 举个例子: #include using namespace std; class Base { public: virtu 阅读全文
posted @ 2023-07-11 15:13 CodeMagicianT 阅读(122) 评论(0) 推荐(0)
摘要: # 71.静态类型和动态类型,静态绑定和动态绑定的介绍 在C++中,变量的类型可以分为静态类型和动态类型两种。 ## 1.类型 **静态类型**:静态类型是指在程序运行时分配的类型,它们的大小和数据结构在程序运行时就已经确定了,因此可以直接使用int、float等基本数据类型或者自定义数据类型。静态 阅读全文
posted @ 2023-07-11 15:12 CodeMagicianT 阅读(133) 评论(0) 推荐(0)
摘要: # 70.如何获得结构成员相对于结构开头的字节偏移量 使用头文件中的,offsetof宏。 举个例子: ```C++ #include #include using namespace std; struct S { int x; char y; int z; double a; }; int ma 阅读全文
posted @ 2023-07-11 15:11 CodeMagicianT 阅读(54) 评论(0) 推荐(0)
摘要: # 69.C++中将临时变量作为返回值时的处理过程 1.函数返回值的存储位置: - 在C语言中,函数返回值通常会被**存储在寄存器中**(如ax、eax等),而不是堆栈中。这样设计的目的是为了提高执行效率,避免频繁的堆栈操作。 - 在函数调用结束后,返回值**仍然保留在寄存器中**,并且在函数退出时 阅读全文
posted @ 2023-07-11 15:09 CodeMagicianT 阅读(587) 评论(0) 推荐(0)
摘要: # 68.说说移动构造函数 1.我们用对象a初始化对象b,后对象a我们就不再使用了,但是对象a的空间还在呀(在析构之前),既然拷贝构造函数实际上就是把a对象的内容复制一份到b中,那么为什么我们不能直接使用a的空间呢?这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷; 2 阅读全文
posted @ 2023-07-11 15:09 CodeMagicianT 阅读(45) 评论(0) 推荐(0)
摘要: # 67.写C++代码时有一类错误是 coredump ,很常见,你遇到过吗?怎么调试这个错误? coredump是程序由于异常或者bug在运行时异常退出或者终止,在一定的条件下生成的一个叫做core的文件,这个core文件会记录程序在运行时的内存,寄存器状态,内存指针和函数堆栈信息等等。对这个文件 阅读全文
posted @ 2023-07-11 15:09 CodeMagicianT 阅读(109) 评论(0) 推荐(0)
摘要: # 66.C++函数调用的压栈过程 ## 1.以例子进行讲解 从代码入手,解释这个过程: ```C++ #include using namespace std; int f(int n) { cout << n << endl; return n; } void func(int param1, 阅读全文
posted @ 2023-07-11 15:08 CodeMagicianT 阅读(105) 评论(0) 推荐(0)
摘要: # 65.C++的四种强制转换 ## 1.C语言中的类型转换 ``` C语言和C++都是强类型语言,如果赋值运算符左右两侧变量的类型不同,或形参与实参的类型不匹配,或返回值类型与接收返回值的变量类型不一致,那么就需要进行类型转换。 ``` C语言中有两种形式的类型转换,分别是隐式类型转换和显式类型转 阅读全文
posted @ 2023-07-11 15:08 CodeMagicianT 阅读(259) 评论(0) 推荐(0)
摘要: # 64.成员初始化列表的概念,为什么用它会快一些? ## 1.成员初始化列表的概念 在类的构造函数中,不在函数体内对成员变量赋值,而是在构造函数的花括号前面使用冒号和初始化列表赋值 ## 2.效率 用初始化列表会快一些的原因是,对于类型,它少了一次调用构造函数的过程,而在函数体中赋值则会多一次调用 阅读全文
posted @ 2023-07-11 15:07 CodeMagicianT 阅读(119) 评论(0) 推荐(0)
摘要: # 63.介绍面向对象的三大特性,并且举例说明 三大特性:继承、封装和多态 ## 1.封装 C++中的封装是指将属性和方法包装在一个类中,并通过访问控制符来限制外部对类的访问。封装可以提高代码的可维护性和安全性,同时也可以实现多态性。 在C++中,封装可以通过以下方式实现: 1.使用访问控制符:C+ 阅读全文
posted @ 2023-07-11 15:06 CodeMagicianT 阅读(131) 评论(0) 推荐(0)