C++基础内容概述
文章平均质量分 78
当谈到C++编程,理解基础知识至关重要。这篇文章为您提供了一份扎实的C++基础知识概述。从语法和数据类型到函数和面向对象编程,我们将探讨C++的核心概念,为您奠定坚实的编程基础。不论您是初学者还是寻求巩固知识的程序员,这篇文章将帮助您理解C++的基础,为您未来的编程旅程打下坚实的基础。
九月丫
爱好编程,爱好生活
展开
-
C++标准模板库 STL 简介(standard template library)
容器的实现就是靠模板类去实现的,例如 C++中的动态数组容器 vector,它其实就是一个类,类中维护了一块地址,然后类中的函数就可以定义为一些数组的行为,例如添加元素,删除元素等等,同时相比于 C 语言中的数组,使用容器因为是类在维护,所以,类中一般会进行安全性判断,对一些不安全的操作会进行规避,例如:C 语言中的数组 a 可以访问 a[-1],但是对于 C++中的容器 a,访问 a[-1]就会被拒绝.一般函数指针可视为狭义的。STL 提供的算法具有工业强度,高性能,用它可开发出性能高效的应用程序。原创 2023-11-27 19:22:06 · 291 阅读 · 0 评论 -
C++多态-虚函数
同理,如果基类的虚函数是公有的,派生类继承过去的虚函数是私有的,那么可以通过基类指针去访问这个虚函数,而且基类指针指向派生类,那么访问的虚函数内容就是派生类中的内容,因为不是直接通过函数名去访问派生类中这个虚函数的,而是因为虚表替换了虚函数内容,通过虚表访问的,所以尽管派生类中这个虚函数是私有的,通过基类指针也是可以访问的。当基类中有虚函数时,子类继承它他时,同样也会继承它的虚表指针,对于虚函数,子类可以重写他(纯虚函数必须重写),重写了虚函数后,那么子类继承下来的虚表中将会替换被重写的虚函数地址。原创 2023-11-25 15:09:12 · 242 阅读 · 0 评论 -
C++继承概述
其中,容易让人产生误解的是,是不是虚继承之后,我内部有一个虚表了,就不需要去继承基类的元素了,答案是还是要继承一份基类的元素的,如果单纯是单继承或多继承,虚继承的意义其实并不大,但是对于菱形继承,因为存在数据的二义性,所以对于菱形继承,较有重要的意义。通过受保护继承后,基类中的公有成员在派生类中变成受保护的,派生类可以正常访问,基类的私有数据在派生类中是私有的,派生类不可访问,受保护数据在派生类中还是受保护的,派生类可以访问。但是,使用基类指针访问派生类,只能访问从基类中继承下来的数据,不能访问派生类中。原创 2023-11-25 14:47:26 · 157 阅读 · 0 评论 -
C++范型编程(范式编程)
例如设计一个数组类型,这个数组可能只能存放 int 类型的数据,但是我们在使用数组时,不一定总是用 int 数组,可能需要其他类型的数组即,数组是一个通用的概念,不应该局限于某种特定的类型(如 int 类型),如果,设计出来的数组,能存放任意类型的元素,那么这就是泛型。开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。在 C++中,用模板来实现泛型,或者说 用模板来表示通用的概念。原创 2023-11-25 14:19:45 · 233 阅读 · 0 评论 -
C++ -std 编译标准
举个例子,下面是一段 C++代码,里面使用到了 C++11 标准的 auto 自动推导,如果你的编译器没有默认指定以 C++11 标准去编译的会可能就会报错,所以这时我们要手动指定编译标准。原因很简单,时代在发展,编程语言如果停滞不前,最终就会被淘汰。编译器,默认使用的标准版本也不尽相同。甚至于在这些标准的基础上,GCC 编译器本身还对 C。甚至于在这些标准的基础上,GCC 编译器本身还对 C。语言为例,发展至今该编程语言已经迭代了诸多个版本,例如。读者可能会问,这么多标准,GCC。编译标准也是不同的。原创 2023-11-07 20:03:39 · 381 阅读 · 0 评论 -
C++auto 关键字
在 C++11 中,就赋予了 auto 一个新的功能-自动类型推导。auto 声明的变量必须由编译器在编译时期推导而得,简单来说就是由编译器来识别变量的类型。后变成了局部的自动变量,就是当前变量的生存周期是由编译器自动决定的,但是这和局部变量没有区别,所以。,在编译阶段编译器需要根据初始化表达式来推导 auto。语言中它的作用是声明自动变量,例如。编译报错,影响重载形式下的调用绑定。语言中就已经存在了,只不过在。的声明,而是一个类型声明时的。替换为变量实际的类型。,编译器在编译期会将。原创 2023-11-07 19:59:36 · 101 阅读 · 0 评论 -
C++范围枚举
若不指定枚举成员类型,限定作用域枚举类型成员默认为 int,不限定作用域枚举类型成员不存在默认类型,能够确定的是成员类型足够大到能容纳所有成员。在旧标准中,枚举变量可以使用整数常量进行赋值,但在 C++11 标准中,要想初始化枚举类型对象或对枚举对象赋值,必须使用该类型的一个枚举成员或该类型的一个对象。3. 不限定作用域枚举类型的枚举成员与枚举类型外部数据处在同一个作用域范围内,多个枚举类型不能有同名的枚举成员。相对于不限定作用域的枚举类型,限定作用域的枚举类型定义的枚举成员在枚举类型作用域外不可访问。原创 2023-11-07 19:54:03 · 121 阅读 · 0 评论 -
运算符重载(operator)
我们再举例两个个二元流运算符<<和>>,实现要对运算符进行重载,我们就一定要清楚,运算符的操作数都应该为啥类型,上面我们重载+号是为了实现两个 A 类相加,得到一个 A 类,所以运算符重载函数的参数就是两个 A 类引用,返回值 为 A 类,现在对<<和>>进行重载,我们希望可以通过<<输出类的成员变量,利。在学习类的 this 指针的时候我们知道成员函数是默认有一个隐藏参数指向该类的地址的(this),那么也就是说,如果我们将运算符重载函数声明为类的成员函数后,就不需要传递调用者自身的一个对象了。原创 2023-11-07 19:42:25 · 390 阅读 · 0 评论 -
类(class)
按 c++的封装性来说,最主要的目的就是确保数据的安全,实现信息的隐藏,从原则上来 说,类的私有成员和保护成员,在类的外部是不能直接访问的,但是,有一个例外,这个就是友元(friend),友元就是在类的声明中,用关键字 friend 修饰的函数或者类,友元授予一个函数或者一个类特权,允许他们能直接访问本类的隐藏信息.定义号一个人的属性之后,如果想对这个人有所操作的话,就要去定义函数,然后去在主函数中去实现一些函数的过程逻辑,所以说 c 语言是一种面对过程编程的语言,而在 C++中,对结。原创 2023-11-06 20:34:07 · 590 阅读 · 0 评论 -
C++中的函数玩法
函数调用是有时间和空间开销的。因为带默认参数的函数,传递参数时传递的个数是可变的,那么当遇上上面情况时,如果调用 sun(2,3)就会报错,会产生模糊的调用,而调用 sun(2,3,4)则可以正确的重载到 sun(int a,int b,int c =3)这个函数。前面章节我们讲过,在 C++中,函数会被经过换名处理,新的名字是受返回值,函数名,形参决定,所以只要是参数类型不同,参数个数不同,参数的顺序就可以定义相同的函数名。在编译的时候,系统会根据你传递的实参个数或类型来匹配对应的函数,这就叫函数重载。原创 2023-11-06 10:36:53 · 60 阅读 · 0 评论 -
C++内存分配 new 和 delete
而使用 new(std::notheow)在分配失败的时候就不会抛出异常,而是直接将该指针置空,后续你只需要判断这个指针是否为空就可以知道 new 分配成功与否,例如。在实际开发中,内存的分配失败是非常普通的,它们通常在植入性和不支持异常的可移动的器件中发生更频繁。如上,当使用 new 或 new []分配空间不足时,就会抛出异常,但是指针并不会置空,这样就会给这个指针后续的判断使用存在一些隐患。内存分配失败的时候抛出的异常,在分配异常的情况下这时的指针。来替代普通的new 可以更加安全!原创 2023-11-06 10:24:31 · 161 阅读 · 0 评论 -
C++引用概述
1.指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,可以理解为是原变量的一个别名而已。变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),程序中通过变量来申请并命 名内存空间,通过变量的名字可以使用存储空间。2. 引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。5. 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。6. sizeof 引用得到的是所指向的变量。原创 2023-11-02 20:11:22 · 76 阅读 · 0 评论 -
C++深拷贝和浅拷贝
拷贝发生于用被拷贝对象实例化新对象,过程中被拷贝对象的属性值会 一 一 赋值给新对象。那么当我们的类中存在指针或者动态的内存分配时,使用普通拷贝(浅拷贝,默认拷贝)只会将那块内存的位置告知当前对象,并不会重新为新对象分配内存。当一个对象去拷贝(创建)另一对象时,拷贝完以后,这两个对象之间存在资源共享,这样的拷贝称之为浅拷贝,当用一个对象去拷贝另一个对象,拷贝完以后,这两个对象之间不存在资源共享,这样的拷贝称之为深拷贝。3.深拷贝重新申请了空间,改变被拷贝对象时拷贝对象不会变化;原创 2023-11-02 20:04:59 · 107 阅读 · 0 评论 -
C++中的强制类型转换方式
在上面所有形式中,e 的类型必须符合以下三个条件中的任何一个:e 的类型是是目标类型 type 的公有派生类、e 的类型是目标 type 的共有基类或者 e 的类型就是目标 type 的的类型。e也可以是一个空指针,结果是所需类型的空指针。static_cast 相当于传统的 C 语言里的强制转换,该运算符把变量转换为指定类型,用来强迫隐式转换,例如 non-const 对象转为 const 对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。原创 2023-11-02 20:01:00 · 151 阅读 · 0 评论 -
C++异常处理
上面就是 std 中包含的一些异常类型,它们都是继承 exception 而来的,例如当使用了无效的参数时,就会抛出一个 std::invalid_argument 的错误,而程序开发者其实要定义新的异常类型时,可以继承 exception 类来做处理。上图是系统中 bad_alloc 异常类型的由来,可以看到他也是继承 exception 而来的,由此示例,当我们想要其他类型的异常处理的时,我们也可以根据上图的方法去继承一个新异常类型,例。如果抛出其他类型的异常,try 将无法捕获,只能终止程序。原创 2023-11-02 19:50:20 · 62 阅读 · 0 评论 -
C++和 C 混合编程处理
在 C++中提供了一个关键字:extern "C",称为链接指示,即告诉 C++编译器,用 extern "C" 修饰的函数,是用 C 编译器编译的,当调用这个函数的时候,不要去修改它们的名字,大多数情况下,extern "C" 是写在头文件中的。但是用 C 开发的功能,很可能已经用 C 编译器编程成目标文件(或打包成库了),那么目标文件中的函数名已经确定下来了,C++去调用函数时,会进行换名处理,将导致,在目标文件中找不到对应的函数。那么怎么解决 c++会对 c 函数进行换名处理而找不到定义呢?原创 2023-11-02 19:31:18 · 144 阅读 · 0 评论 -
C++标准输入输出类cout,cin用法概述
在使用 cout 对内容格式进行控制的操作一般在 std 里面的一些类可以对其进行处理,具体的一个介绍将关注后续容器一章的讲解,下图讲述了一些输出格式控制的控制类,可以根据所需操作对应去查找相关 std 容器的用法。可以看到 ignore 把缓冲区字符 p 之前的都清除了,也包括 p,其中 ignore 的第一个参数是一个最大清除流大小的一个字段,只要将它设置的足够大,就只有第二个参数有效了。需要注意的是,使用 cin 输入的时候,输入的类型一定要正确,否则会出现意想不到的错误,原创 2023-11-02 19:25:21 · 523 阅读 · 0 评论 -
C++命名空间概述
using 关键字可以对命名空间进行引用,比如有一个主文件夹,也就是我们的主进程空间,里面有一个子文件夹 叫 sdt,也就是我们的 std 名字空间,std 这个子文件夹中有一个 cin 文件,一般我们是没法直接在主文件夹是没法 cin 的,而要进入 std 子文件夹中去使用它,也就是我们在使用 cin 的时候需要 std::cin 去索引它,而 using 的作用就是可以将这些子文件中的东西拷贝到主文件中,也就是可以不使用作用域符::去索引就可以使用名字空间中的东西。的名字空间中声明和定义的。原创 2023-11-02 17:26:33 · 59 阅读 · 0 评论