上一篇文章讲解了多态、虚函数、纯虚函数。这一篇文章来讲讲C++的数据抽象、封装、接口。
A、 0 B、 1 C、 4 D、8
原文链接:https://winter.blog.csdn.net/article/details/129376476
使用函数重载虽然可以实现,但是有一下几个不好的地方: 1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数 2. 代码的可维护性比较低,一个出错可能所有的重载均出错
上回我们学习了类的定义,初步了解了什么是类?类的定义,以及类的三个访问限定符:public,private,protected,本小节将讲解类的实例化,类对象模型的猜想存储,及三种简单类的计算。
C++ 的一些语言特性使之必须由编译器和链接器共同支持才能完成工作。最主要的有两个方面,一个是C++ 的重复代码消除,还有一个就是全局构造与析构。另外由于C++ 语言的各种特性,比如虚拟函数、函数重载、继承、异常等,使得它背后的数据结构异常复杂这些数据结构往往在不同的编译器和链接器之间相互不能通用,使得C++ 程序的二进制兼容性成了一个很大的问题,我们在这一节还将讨论 C++ 程序的二进制兼容性问题。
简单总结下C++变量在内存中的布局和可执行文件相关的知识。暂未涉及虚函数,虚函数表,类的继承和多态等C++对象的内存模型。对象的内存模型推荐经典书籍《 深度探索C++对象模型》,豆瓣评分9.1。
在这里,typename T 定义了一个类型参数,它在函数模板被实例化时将被具体的类型替换。例如,如果你用 int 类型实例化该模板,编译器将生成一个接受 int 参数并返回 int 类型值的函数,T代表类型
Java中没有指针的说法,Java中的引用就类似于C++的指针, Java的引用是栈区的一个变量, 如果引用的是基本数据类型,那它存储着就是栈区的一块内存,(因为普通基本数据类型由栈区管,long、int、short、byte、float、double、string、boolean),做形参时是传值调用; 如果引用的是new出来的实例(new String('a')也算,直接写'a'则存在栈区),则这个引用存储的是堆区一块内存的地址(这个时候就类似于C++的指针),做形参时是传引用调用,即C++中的传指针调用;
多态是同一个行为具有多个不同表现形式或形态的能力。比如重写父类方法、重载同一方法等。
1.重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数
那能否 告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码 呢?
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它(实例化后才会开辟物理空间,后面会讲到);比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。也可以理解为这是一个自定义类型,与C语言中的结构体(struct)颇有类似。
Qt 早期是一个跨平台 C++ 图形用户界面应用程序开发框架,内部封装了大量的跨平台库,可以在 linux、windows、android、ios 等平台运行其编写的程序,并且还提供了一个强大的 IDE 工具 名为 Qt Creator。Qt 让我们对界面的编程变为“对象与对象之间相互作用”的结果。所以不要再像 C 语言一样去创建或编写 Qt 的程序,下面我们就简单实现一个 Qt 的界面程序。
Qt是1991年由HaavardNord和EirikChambe-Eng开发的跨平台C++图形用户界面应用程序开发框架。发展至今,它既可以开发GUI程序,也可以开发非GUI程序,比如控制台工具和服务器。Qt是一个跨平台的C++应用程序框架,支持Windows、Linux、MacOSX、Android、嵌入式系统等。也就是说,Qt可以同时支持桌面应用程序开发、嵌入式开发和移动开发,覆盖了现有的所有主流平台。开发者只需要编写一次代码,而后在发布到不同平台之前重新编译即可。
大型C++工程项目,都会面临编译耗时较长的问题。不管是开发调试迭代、准入测试,亦或是持续集成阶段,编译行为无处不在,降低编译时间对提高研发效率来说具有非常重要意义。
C语言是面向过程的语言,关注的是过程,把洗衣服这件事拆分成浸泡,漂洗,脱水,晾干等过程,把过程写成函数,最后调用函数来完成;
可以看到,类实例化的对象的大小为1。这是因为即使类是空白类,编译器也会分配一个字节的空间来占位,用来和真正的空白/空变量区别开来(毕竟实例化其实就是分配一定的内存空间,如果没有分配空间,那么就和没有实例化差不多了)。不过注意的是,如果空白类作为基类被继承了的话,是不会对继承它的类的空间产生影响的,即在继承的一瞬间,基类大小变为0,而继承它的类的大小只与自己的成员变量有关(此处默认为单一继承):
内部类是定义在另一个类内部的类,它可以访问外部类的私有成员。匿名类是没有名字的类,通常用于一次性使用的简单对象创建,可以直接在需要使用的地方定义,并传递给其他方法。内部类和匿名类都是C++等编程语言的重要特性,它们可以简化代码结构,提高代码重用性。
泛型编程是一种编程范式,它允许在编写代码时使用一种通用的数据类型或算法,以便在不同的数据类型上进行操作,而不需要为每种数据类型编写专门的代码。泛型编程的目标是提高代码的重用性和可扩展性。
前言:在C++编程世界中,模板是一个强大的工具,它使得程序员能够编写更加通用、灵活和可重用的代码。通过模板,我们可以编写与类型无关的代码,这些代码可以在编译时根据所需的具体类型进行实例化。本文将带你走进C++模板的初阶世界,探索泛型编程的基石
C++如何实现不能被继承的类,即终结类。Java中有final关键字修饰,C#中有sealed关键字修饰,而C++目前还没有类似的关键字来修饰类实现终结类,需编程人员手动实现。但从C++11开始,提出了final关键字来申明终结类。
我想知道上帝的構思,其他的都祇是細節。 ——爱因斯坦
一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,在C++中实体对应的就是对象,实体抽象数据类型就是类,属性是成员变量,行为是成员函数。
C++如何实现不能被继承的类,即终结类。Java中有final关键字修饰,C#中有sealed关键字修饰,C++11之前还没有类似的关键字来修饰类实现终结类,需编程人员手动实现。但从C++11开始,提出了final关键字来申明终结类。
本文介绍了C++模板的基础概念,简单介绍了泛型编程,模板,以及模板中的函数模板与类模板等相关概念。
在C++中,模板是一种强大的特性,可以实现代码的泛型编程,从而减少代码的重复,提高代码的复用性和可维护性。本文将详细讲解C++模板,涵盖以下几部分内容:
1. 假设要交换两个变量的值,如果只是用普通函数来做这个工作的话,那么只要变量的类型发生变化,我们就需要重新写一份普通函数,如果是C语言,函数名还不可以相同,但是这样很显然非常的麻烦,代码复用率非常的低。 那么能否告诉编译器一个模板,让编译器通过模板来根据不同的类型产生对应的代码呢?答案是可以的。
当我们想用一个函数完成多个类型参数的操作时,发现每次都要重新再写一个函数再使用,对于重载的函数虽然可以使用,但是每次用新的类型都需要再去重载一次函数**。** 例如实现交换的函数:
那么我们是否可以让编译器像活字印刷一样,需要那种类型的函数直接生成一个就好了?
在C语言阶段,要实现一个通用的交换函数我们只能通过定义对应不同参数类型的多个函数来实现,而且各函数的函数名不能相同,比如 Swapi、Swapd、Swapc;到了C++阶段,我们可以通过函数重载来定义多个参数类型不同但函数名相同的函数来实现,但是函数重载有以下几个缺陷:
越来越读不下去传统的一些编程书了,我个人反思了一下,我觉得不是书的毛病,是我的毛病,这些书的出发点都是初学者或是稍微有点基础的读者,经常是对一个概念解释很多次,翻来覆去的说,而且给的demo看起来也比较呆瓜。其实实用性还是差很多的,看代码里面都是使用的一些新标准新特性,但是这些书都是有点老了,也不讲。
【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等。这些内容被组织成结构合理、联系紧密的章节,每章都可在1小时内阅读完毕,都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。本文是系列笔记的第八篇,欢迎各位阅读指正!
\\\ ⱶ˝୧(๑ ⁼̴̀ᐜ⁼̴́๑)૭兯 //// \\\ ⱶ˝୧(๑ ⁼̴̀ᐜ⁼̴́๑)૭兯 //// \\\ ⱶ˝୧(๑ ⁼̴̀ᐜ⁼̴́๑)૭兯 ////
C语言大家都比较熟悉了,是属于底层编程语言了,计算机行业里有句话说“C生万物”!不得不说,C语言的出现,改变了计算机的编程语言世界。
很多的知识,学习的时候理解其实并不是很深,甚至觉得是是不太必要的;而到了实际使用中遇到了,才有了比较深刻的认识。
在我们学习过的C语言中,C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题;而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
前言:在前面几节我们为正式进入C++做足了铺垫,现在我们有了足够的基础让我们进入C++,让我们来进入类和对象来真正了解C++!
1. 模板参数分为类型模板参数和非类型模板参数,类型模板参数一般是class或typename定义出来的泛型,而非类型模板参数一般是整型定义出来的常量,这个常量作为类模板或函数模板的一个参数,在类模板或函数模板中可将该参数当成常量来使用。
我们在编写代码时,如果只是编写了函数模板本身,编译器是不会为我们生成函数的定义的。当编译器使用模板为特定的类型生成函数定义时,就会得到一个模板的实例。这个概念有点像是Python里的元类,元类的实例是另外一个类。
通过之前C语言的学习我们可以知道,内存区域主要分为几个区: 从上至下分别是栈,堆,静态区,常量区
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
这是技术面试过程中经常问的问题,真要彻底的讲明白,不是一件很容易的事情。可以简单的用C语言和C++两种语言的本质区别来具体解释,首先从设计模式来讲面向对象更加容易形成框架特性,现在高级语言基本上都支持面向对象,像java,python都是这个样子。
PS:const原则上不能修改,但是可以通过找到其空间直接修改。(指针/别名)
C++作为NOIP最被认可的语言,是大部分学习NOIP的学生的第一语言。今天清北信息学金牌教研团带大家对C++有一个基本的认识。
其实和C语言最大的区别就在于: C语言中struct只可以定义变量,C++中的struct既可以定义变量,也可以定义函数(实现方法)。
这一次的博文总结下数据封装、数据抽象与接口,其实有之前博文的基础这里也很容易理解。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制, C++ 通过创建类来支持封装和数据隐藏(public、protected、 private)。
PS:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
C++在原C语言的基础上新增了面向对象(Object-Oriented)的思想,使其从一门关注解题方法与过程的语言转变为关注解题对象的语言,对于C++来说,万物皆可是对象,下面跟随我的脚步,一起走进C++类和对象的世界
领取专属 10元无门槛券
手把手带您无忧上云