突破编程_C++_面试(基础知识(9))

面试题24:什么是面向对象编程

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式或编程模型,它基于对象的概念来设计和实现程序。在面向对象编程中,程序是由一系列对象组成的,这些对象是对现实世界中的实体或抽象概念的软件表示。每个对象都有其特定的属性和行为,这些属性和行为分别由对象的成员变量(或称为属性、字段等)和成员函数(或称为方法)来定义。
面向对象编程的三大基本特性是:封装( Encapsulation )、继承( Inheritance )和多态( Polymorphism )。
(1)封装(Encapsulation)
封装是指将对象的属性和方法隐藏在其内部,只通过有限的接口与外部进行交互。这样可以防止外部代码随意访问和修改对象的内部数据,从而提高代码的安全性和可维护性。
(2)继承(Inheritance)
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而实现代码的重用。子类可以继承父类的所有非私有属性和方法,并可以添加或覆盖父类的方法。 C++ 支持三种类型的继承:公有继承( public )、保护继承( protected )和私有继承( private )。其中,公有继承是最常用的继承方式。
(3)多态(Polymorphism)
多态是指允许一个成员函数被多种数据类型实现(重载),或者一个成员函数在不同场景下有不同实现方式(重写)。多态性允许使用基类的指针或引用来调用派生类中的成员函数,在运行时根据实际对象的类型来确定调用哪个函数,从而增强了程序的灵活性和可扩展性。

面试题25:面向对象编程的优点有哪些

(1)通过继承增强代码的可重用性:可以很方便地重用父类的属性与方法。
(2)通过封装增强代码的可维护性:可以隐藏对象的内部实现细节,只通过有限的接口与外部进行交互,从而降低代码的耦合度,提高代码的可维护性。
(3)通过多态增强代码的可扩展性:可以在不修改现有代码的情况下,增加新的功能或重构现有功能的行为。

面试题26:类的构造函数有哪些种类

根据构造函数的参数列表和特性,可以将构造函数分为 6 种不同的类型:
(1)默认构造函数
默认构造函数是一种没有参数的构造函数。如果类中没有定义任何构造函数,编译器会自动生成一个默认构造函数。如果类定义了其他构造函数,但没有定义默认构造函数,编译器就不会自动生成默认构造函数,如下为样例代码:

class Animal1
{
};class Animal2
{
public:Animal2(string name) {}
};Animal1 animal1;		// OK:类中没有定义任何构造函数,编译器会自动生成一个默认构造函数 Animal2 animal2;		// 错误:类定义了其他构造函数( Animal2(string name) ),但没有定义默认构造函数,编译器就不会自动生成默认构造函数 
Animal2 animal2("aa");	// OK:

(2)参数化构造函数
参数化构造函数是带有参数的构造函数。它可以有一个或多个参数,用于在创建对象时初始化对象的成员变量。如下为样例代码:

class Animal
{
public:Animal(string name) {}
};Animal animal("aa");	// OK:

(3)拷贝构造函数
拷贝构造函数是一种特殊的构造函数,它使用一个已存在的对象来初始化新创建的对象。它的参数是对同类型对象的常量引用。如果类没有显式定义拷贝构造函数,编译器会提供一个默认的拷贝构造函数。如下为样例代码:

#include <iostream>  
#include <string>  using namespace std;class Animal
{
public:Animal() {printf("call Animal()\n");}Animal(const Animal& animal){printf("call Animal(const Animal& animal)\n");}
};int main() {Animal animal1;				// 调用无参数的构造函数Animal animal2(animal1);	// 调用拷贝构造函数return 0;
}

上面代码的输出为:

call Animal()
call Animal(const Animal& animal)

(4)列表初始化构造函数
列表初始化构造函数使用成员初始化列表来初始化对象的数据成员,C++11 的列表初始化特性需要该种类型构造函数的支持。如下为样例代码:

#include <iostream>  
#include <string>  using namespace std;class Animal
{
public:Animal(const string& name) : m_name(name){printf("call Animal(const string& name) : m_name(name)\n");}private:string m_name;
};int main() {		Animal animal{"aa"};	// 调用列表初始化构造函数return 0;
}

上面代码的输出为:

call Animal(const string& name) : m_name(name)

(5)委托构造函数
委托构造函数是一种特殊的构造函数,它调用同类的另一个构造函数来执行初始化。这可以通过使用类名并跟随参数列表来实现。C++11 及以后的版本支持委托构造函数。如下为样例代码:

#include <iostream>  
#include <string>  using namespace std;class Animal
{
public:Animal() : Animal("default"){printf("Animal() : Animal(\"default\")\n");}Animal(const string& name) : m_name(name){printf("call Animal(const string& name) : m_name(name)\n");}private:string m_name;
};int main() {		Animal animal;return 0;
}

上面代码的输出为:

call Animal(const string& name) : m_name(name)
Animal() : Animal("default")

注意:先调用的是委托构造函数。
(6)移动构造函数
移动构造函数是一种特殊的构造函数,它使用右值引用参数将资源从一个对象移动到另一个对象,而不是复制。这通常用于优化性能,特别是在处理如 vector 、 string 等可能包含动态分配资源的类型时。如下为样例代码:

#include <iostream>  
#include <string>  using namespace std;class Animal
{
public:Animal(){printf("call Animal()\n");}Animal(const Animal& animal){printf("call Animal(const Animal& animal)\n");}Animal(Animal&& other) noexcept		//移动构造函数{printf("call Animal(Animal&& other)\n");}
};int main() {		Animal animal1;					// 调用无参数构造函数Animal animal2 = animal1;		// 调用拷贝构造函数Animal animal3 = move(animal1); // 调用移动构造函数return 0;
}

上面代码的输出为:

call Animal()
call Animal(const Animal& animal)
call Animal(Animal&& other)

面试题27:类的访问修饰符权限如何划分

本类继承类其他
private××
protected×
public

其中值得注意的是 protected 访问修饰符的用法:该访问修饰符在设计继承层次结构时特别有用。它允许派生类访问基类的实现细节,同时仍然保持对这些细节的封装和隐藏。这有助于实现更灵活和可维护的代码结构。
注意 protected 和 private 的区别:
如果其他类从该类派生(无论是公开派生还是私有派生),那么派生类中的成员函数可以访问基类中的 protected 成员。这是 protected 与 private 的区别,因为 private 成员在派生类中是不可访问的。

面试题28:this指针在C++中是如何工作的

this 是一个特殊的指针,它代表对象自身。this 指针是隐式传递给每个成员函数的,它允许成员函数访问和修改调用它的对象的成员。this 指针在成员函数内部是自动可用的,不需要显式声明。它通常用于区分成员变量和参数名称相同的情况,或者在函数内部引用当前对象的其他成员:

class Animal
{
public:Animal(string name){//name = name;		// 如果这里不使用 this ,则无法分别这个变量 name 是入参还是成员变量this->name = name;}public:string getName(){return this->name;	// 此处的 this 可以用也可以不用}private:string name;
};

在上面的代码中,构造函数 Animal(string name) 和成员函数 getName() 都使用了 this 指针。在构造函数 Animal(string name) 中,this->name表示对象的 name 成员变量,而构造函数的入参也是 name 。使用了 this 指针可以使得代码更加清晰,尤其是在成员变量和参数名称相同或相似的情况下。
需要注意的是,在大多数情况下,this 指针的使用是隐式的,编译器会自动处理。只有在需要区分成员变量和函数参数,或者需要在成员函数中显式引用当前对象时,才需要显式地使用 this 指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES实战-book笔记1

#索引一个文档,-XPUT手动创建索引, curl -XPUT localhost:9200/get-together/_doc/1?pretty -H Content-Type: application/json -d {"name": "Elasticsearch Denver","organizer": "Lee" } #返回结果 {"_index" : "g…

尚硅谷 Vue3+TypeScript 学习笔记(中)

目录 三、路由 3.1. 【对路由的理解】 3.2. 【基本切换效果】 3.3. 【两个注意点】 3.4.【路由器工作模式】 3.5. 【to的两种写法】 3.6. 【命名路由】 3.7. 【嵌套路由】 3.8. 【路由传参】 query参数 params参数 3.9. 【路由的props配置】 3.10. 【 replace属性…

机器学习:SVM、softmax、Dropout及最大池化max_pool介绍

一、利用线性SVM进行分类 train_data: (train_num, 3072) 训练流程 初始化权重W: (3072, 10) 梯度dW: (3072, 10)train_data和权重相乘得到score(10,)对应每个类别的分数 2.1 对于每个score中的分数i&#xff0c;如果是正确的类别对应的score跳过 2.2 如果是其他的类别&…

【GAMES101】Lecture 20 颜色

目录 光 颜色 加色系统 CIE RGB颜色匹配实验 颜色空间 CIE XYZ颜色空间 HSV颜色空间(Hue-Saturation-Value) CIELAB空间 减色系统&#xff1a;CMYK 光 光是由不同波长的光波组成的&#xff0c;其中可见光的波长范围在400nm到700nm 用谱功率密度&#xff08;Spectral…

Low 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开 DVWA 靶场并登录&#xff0c;找到反射型 XSS 页面&#xff08;笔者这里是 Low 级别&#xff09; 先…

图像处理之《鲁棒图像隐写术:隐藏频率系数中的信息》论文精读

一、文章摘要 隐写术是一种将秘密信息隐藏到公共多媒体对象中而不会引起第三方怀疑的技术。然而&#xff0c;大多数现有的工作不能提供良好的抗有损JPEG压缩鲁棒性&#xff0c;同时保持相对较大的嵌入容量。提出了一种基于可逆神经网络的端到端鲁棒隐写系统。该方法将秘密信息…

SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配

文章目录 2.6 WebMvc场景下的自动装配原理2.6.1 WebMvcAutoConfiguration2.6.2 Servlet容器的装配2.6.2.1 EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow2.6.2.2 BeanPostProcessorsRegistrar(后置处理器的注册器)2.6.2.3 两个定制器的注册 2.6.3 DispatcherServlet的装配2…

医学搜题神器找答案? #知识分享#职场发展

大学生必备的搜题工具&#xff0c;专业课本习题、电子版教材、考研资料、英语四六级等考试题目也能一并搜索&#xff0c;每道题目都有详细的讲解&#xff0c;每个都堪称大学神器。 1.题小聪 这是一个公众号 它支持文本搜索、扫码搜书、拍照搜索&#xff0c;不会的题目直接对…

幻兽帕鲁PalWorld服务器2024年配置选择

幻兽帕鲁PalWorld是一款备受期待的虚拟游戏&#xff0c;其独特的幻兽系统和丰富的世界观吸引了大量玩家。然而&#xff0c;随着游戏日益受到关注&#xff0c;服务器的配置选择成为了关键问题。2024年&#xff0c;随着技术不断发展&#xff0c;玩家对于游戏体验的需求也在不断提…

[word] word自定义编号格式怎么设置 #经验分享#职场发展#职场发展

word自定义编号格式怎么设置 在Word文档的编辑中&#xff0c;经常会给段落添加编号&#xff0c;但是在编号的使用过程中我们会遇到很多问题&#xff0c;今天给大家分享word自定义编号格式怎么设置&#xff0c;希望能帮到您&#xff01; 1.如何自定义编号格式&#xff1f; 点击…

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由

NAS如何成为生产力&#xff1f;使用绿联DX4600 Pro搭建图床并实现创作自由 哈喽小伙伴们好&#xff0c;我是Stark-C~ 关注我的小伙伴都知道&#xff0c;我之前有分享过我的创作过程与工具&#xff0c;其中介绍了我个人其实一直都是使用Markdown的编辑器来进行图文创作的。 我…

数据存储的端序(大端序和小端序)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码&#xff0c;离了指针是很难办到的。 2、因为VB/VBA里&#xff0c;用Long来表示指针&#xff0c;而32位(包括64位兼容的)计算机里4字节整数的处理&#xff0c;是最快的方式&#xff01; 3、要想用指针来处理数据&#xff0c;…

leetcode 153

153 寻找旋转排序数组中的最小值 这道题&#xff0c;如果我们熟悉数组 api&#xff0c;可以直接用 Arrays.sort()秒杀&#xff0c;这个方法使用了双轴快速排序算法。 解法1如下&#xff1a; class Solution {public int findMin(int[] nums) {Arrays.sort(nums);return nums…

如何在 Mac 上恢复永久删除的文件:有效方法

您是否错误地从 Mac 中删除了某个文件&#xff0c;并且确信它已经永远消失了&#xff1f;好吧&#xff0c;你可能错了。即使您认为已永久删除计算机上的数据&#xff0c;仍有可能将其恢复。 在本文中&#xff0c;您将了解如何在 Mac 上恢复永久删除的文件&#xff0c;并了解增…

基于微信小程序的校园失物招领小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【Web】小白友好的Java内存马基础学习笔记

目录 简介 文件马与内存马的比较 文件马原理 内存马原理 内存马使用场景 内存马分类 内存马注入方式 这篇文章主要是概念性的&#xff0c;具体技术细节不做探究&#xff0c;重点在祛魅。 简介 内存马&#xff08;Memory Shellcode&#xff09;是一种恶意攻击技术&…

Open CASCADE学习|扫掠

目录 1、BRepPrimAPI_MakePrism Draw Test Harness: C++: 2、BRepPrimAPI_MakeRevol Draw Test Harness: C++: 3、BRepOffsetAPI_MakePipeShell Draw Test Harness: C++: Draw Test Harness: C++: Draw Test Harness: C++:​ 锥度弯曲管 ​ 参考文献:…

【后端高频面试题--Mybatis篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--Mybatis篇 什么是Mybatis&#xff1f;Mybatis的优缺点&#xff1f;Mybatis的特点…

学习总结12

# [NOIP2005 普及组] 采药 ## 题目描述 辰辰是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说&#xff1a…

大水仙花数求解

输入位数&#xff0c;求解水仙花数。暴力求解&#xff0c;位数如果太多&#xff0c;会超时。 思路&#xff1a; &#xff08;1&#xff09;11333355和33331155看上去是不一样的两个数&#xff0c;但是它们又一样&#xff0c;因为相同数字出现的次数一样。 &#xff08;2&…