C++ |【01】面向对象基础内容、引用、函数重载等....
文章目录
- 一、概述
- 1、简介
- 2、C++程序
- 2.1 初步接触C++
- 2.2 面向过程
- 2.3 面向对象
- 2.4 面向对象的三大特性
- 2.4.1 封装
- 2.4.2 继承
- 2.4.3 多态
- 3、C++对C的扩展
- 3.1 双冒号的使用
- 3.2 namespace关键字
- 3.3 using生声和using编译指令
- 3.4 检测增强
- 4、引用
- 4.1 基本用法
- 4.2 参数的传递方式
- 4.3 引用的注意事项
- 4.4 本质【指针常量】
- 4.5 指针的引用
- 4.6 const引用使用场景
- 5、类的初步使用
- 6、内联函数
- 6.1 引出
- 6.2 基本概念
- 7、函数的默认参数
- 7.1 注意事项
- 7.2 占位参数
- 8、函数重载
- 8.1 介绍
- 8.2 实现原理
- 9、封装
- 10、权限
- 10.1 私有方法`private`
- 10.2 保护权限`protected`
- 10.3 将成员设置成private
- 11、const
- 11.1 const是否会影响函数重载
一、概述
1、简介
C++
中的++来自于C语言中的递增运算符++
,该运算符将变量加1。- C++起初也叫
C with cIsss
。通过名称表明,C++是对C的扩展
,因此C++是C语言的超集
,这意味着任何有效的C程序都是有效的C+ +程序。- C++程序可以使用已有的
C程序库
。
库:是编程模块的
集合
,可在程序中导入调用
。可节省
程序员大量的时间
和工作量
。
C++在C上添加面向对象编程和范式编程。且继承了C语言。并且融合了三种不同的编程方式:
- C语言代表过程性语言;
- 添加了类代表的面向对象语言;
- 支持泛型编程。
起源: 与c语言-样,C+ +也是在
贝尔实验室
诞生的,Bjarne Stroustrup
(本贾尼:斯特劳斯特卢普)在20世纪80年代在这里开发了这种语言。
2、C++程序
2.1 初步接触C++
在C++中仍可用
#include<>
导入,保持原有的库,但也有C++版的库。
如:math.h
在C++中可用cmath
#include<iostream>
/** i:表示输入* o:表示输出* stream:数据流
*/using namespace std;
/** using:使用声明* namespace:命名空间的关键词* std:命名空间的名称
*/int main()
{cout << "Hello World" << endl;/** cout:标准输出流* << :左移运算符【可拼接字符串】* endl:结束换行并刷新缓冲区*/system("pause"); // 阻塞功能,让程序不在往后执行 return 0;
}
2.2 面向过程
- 面向过程是一种以
过程为中心
的编程思想。- 通过分析出解决问题所需要的步骤,然后用函数把这些步骤实现,使用的时候一个个
依次调用
就可以了。
面向过程编程思想的核心:
- 功能分解;
- 自上向下、逐层细化。
面向过程编程语高存在的主要缺点是:
- 不符合人的思维习惯而是要用计算机的思维方式去处理问题;
- 语言重用性低,维护困难。
2.3 面向对象
面向对象编程( Object-Oriented Programming )简称
OOP技术
,是开发计算机应用程序的一种新方法、新思想
。【应对变化,提高复用】
过去的面向过程编程常常会导致所有的代码都包含在几个模块中
- 使程序难以阅读和维护;
- 在做一些修改时常常牵一动百,使以后的
开发和维护难以为继
。
而使用O0P技术:
- 要使用许多代码模块,每个模块都只提供特定的功能,它们是
彼此独立
的;- 增大了代码重用的几率,更加有利于软件的
开发、维护和升级
。
在面向对象中,
算法与数据结构
被看做是个整体,称作对象
。现实世界中任何类的对
象都具有一定的属性和操作
, 也总能用数据结构与算法两者合一地来描述。
2.4 面向对象的三大特性
2.4.1 封装
把客观事物封装成
抽象的类
,并且类可以把自己的数据和方法只让可信的类或者对象操作
,对不可信的进行信息隐藏。
类将
成员变量
和成员函数
封装在类的内部,根据需要设置访问权限
, 通过成员函数管埋
内部状态。
2.4.2 继承
- 继承所表达的是类之间相关的关系,这种关系使得对象可以
继承另外类对象的特征和 能力
。
继承的作用:
- 避免公用代码的重复开发
- 减少代码和数据冗余。
2.4.3 多态
多态性可以简单地概括为
一个接口,多种方法
。字面意思为多种形态
。程序在运行时
才决定调用的函数,它是面向对象编程领域的核心概念
。
3、C++对C的扩展
3.1 双冒号的使用
双冒号作用域运算符:
::
:全局运算符;空间名称::
:表示该命名空间下的作用域
3.2 namespace关键字
- 用来解决命名冲突的问题;
- 可使用在函数、变量、结构体、类;
- 命名空间必须定义在全局作用域下;
- 可以嵌套;
- 可以在后部进行续写;
- 若是无名、匿名的命名空间,则相当于静态,只能在本文件内使用;
- 别名,通过
namespace 别名 = 原名
进行修改。
3.3 using生声和using编译指令
声明需要注意二义性
声明:
using 命名::变量/常量
当使用就近原则
的时候,切在该代码区又声明了命名空间
内同种变量或常量时会出现二义性。
using编译指令
编译:
using namespace 命名
。会避免二义性,就近原则优先。
3.4 检测增强
全局变量
检测增强;
如:在C中全局的变量重新定义不报错,而在C++中会报错。
函数
检测增强,参数类型
增强,返回值,函数调用传参;
如:函数没有返回值,参数类型没定义。
类型转化
检测增强。
结构体
增强,C++中可以添加函数
,且在使用
的时候可以不加struct;
- C++中增加
bool类型
;
三目运算符
增强,C++中返回的是变量,可直接复制。C中返回的是值。
const
增强,不可通过指针修改,并且可以初始化数组。
- C语言:const修饰是一个伪常量,会
分配内存
;const为外部链接
;- C++:const
不会分配内存
。若按照C语言的方式去尝试修改值的话。在取地址时,编译器会主动开辟一个临时的地址
来暂存该值,而指针修改的是该临时地址中的值。const为内部链接
;
【注意】当什么时候C++中的const会被分配内存:
取地址
时会临时分配内存;extern
时也会分配内存;- 将
普通变量
初始化(赋值)const;自定义数据类型
(使用结构体);
尽量以const替换define:
- define在
预处理
阶段就将所有值都进行替换,若有错误编译器不会识别到;- define
没有定义类型
;- define
没有作用域
4、引用
4.1 基本用法
使用
&
符号,在等号左侧
使用表示引用。数据类型 &别名 = 原名
- 实质:
起别名
;- 通过变量的名字可以使用
内存空间
;修改引用
即修改原变量
;- 初始化后
不能修改
;
可结合
typedef
来使用
typedef int(name)[];
=>name &pArr = arr;
#include <iostream>
using namespace std;int main() {int x=0;int& r = x;int x2 = 10;r = x2;cout << r << " " << &r << " " << x << " " << &x << endl; cout << x2 << " " << &x2 << endl;return 0;
}
4.2 参数的传递方式
在C语言中接触到了
值传递
、地址传递
,而在C++中又新增了一个引用传递
。
- 引用传递:本质上和地址传递类似,都是对地址进行操控。
- 传入方式:
函数名(int &a, int &b);
。
4.3 引用的注意事项
- 必须引一块合法的内存空间,且不能为
NULL
;- 不要返回
局部变量
的引用;- 若函数的返回值是引用,则这个函数可以作为
左值
,相等于给该返回值赋值。
4.4 本质【指针常量】
在执行代码:
int& n = a
=>int *const n = &a
;
赋值时:n = 100
=>*n = 200
;
4.5 指针的引用
引用与指针搭配,让函数间的传递,赋值等操作更加简洁,通俗易懂。
若传递二级指针,则接受参数只需
* &p
,即可对p进行赋值等操作。传参也只需传入p
即可。
4.6 const引用使用场景
- 常量引用主要用在
函数的形参
,尤其是类的拷贝
或者复制构造函数
;- 将函数的形参定义为常量引用的好处:
- 引用
不产生新的变量
,减少形参与实参传递时的开销;防止实参
随形参的改变
而改变。
5、类的初步使用
类
是对对象
的抽象
;对象
是类
的实例
。
#include<iostream>
using namespace std;// 定义一个全局常量
const double pi = 3.14;/** 创建一个类:需要再内部public下进行编写,为公共属性* class 类名
*/
class Circle
{public: // 具有公共权限double GetS()// 成员函数{return 2 * pi * R;}int R; // 成员属性 };int main()
{Circle circle;// 创建一个类对象circle.R = 4;// 通过对象访问成员属性,对其进行赋值double S = circle.GetS();// 调用成员函数cout << "S:" << S << endl;system("pause");return 0;
}
例:创建学生类
#include<iostream>
#include<string>
using namespace std;class Stu
{public: // 成员属性int Stu_Num;string Stu_Name;int Stu_Age;// 成员方法void ShowInfo(){cout << "学生:" << Stu_Name << "的学号为:" << Stu_Num << "年龄为:" << Stu_Age << endl;}};int main()
{// 创建对象Stu stu;stu.Stu_Age = 10;stu.Stu_Name = "小明";stu.Stu_Num = 1;stu.ShowInfo();system("pause");return 0;
}
6、内联函数
6.1 引出
在C中,在执行一些较为频繁的计算时,通常会将他写成
宏函数
,来提高
程序的执行效率
,而这些都是预处理来完成的。但在C++中会出现部分问题。
- 比如在
编译
的时候若出现问题,他不会报错。- 且在C++中
预处理器不允许访问类的成员
,就是说预处理器宏不能用作类的成员函数。
所以,在C++中为了保持跟C语言同样的效率,引入了
内联函数
。
6.2 基本概念
- 需要在函数前面加上
inline
,注意函数体
和声明
都要带上该关键字;- 内联函数有
占用内存空间
;- 优势在于省去了函数调用时候的
压栈
、跳转
、返回
的开销。【以空间换时间】;- 任何类内部定义的函数都会
自动生成
内联函数。
由于C++的限制,编译器不考虑进行内联函数编译的几种情况:
- 不能存在任何形式的
循环
语句;- 不能存在过多的条件
判断
语句;- 函数体
不能
过于庞大
;- 不能对函数进行
取地址
操作。
内联函数只是编译器的一个
建议
。若你没有声明是内联函数,则编译器也可能将此函数做为内联函数
。
7、函数的默认参数
当函数调用时,若没有该值,则编译器会自动用默认值替换。
7.1 注意事项
- 若参数中,当前位置有了默认参数,则后续的参数应都为默认参数;
int get(int a, int b=1, int c=2)
- 若函数在声明的时候
有默认参数
,则在实现函数
的时候不用写
。
7.2 占位参数
只是暂一个位置,调用时需要
传入参数
,但在函数中不使用
。
8、函数重载
8.1 介绍
- 在同一个
作用域
内,俩个函数作用域相同
,参数不同
【顺序、类型、个数】。- 返回值不能作为函数的重载条件。
- 当函数重载与默认参数一起使用时,要注意避免二义性。
const
也可以作为重载的条件,当重载与引用
结合使用时。由于引用需要一个合法的内存空间
。所以使用const修饰,会指向正确的用法。
8.2 实现原理
在使用
函数重载
时,不同的编译器会将该函数进行重新命名
,并且根据不同的数据类型
、不同的个数
来生成不同的函数名来进行区别。
9、封装
- C语言中行为和属性的封装是分开的
- 封装是将变量和函数合成一个整体,封装在一个类中;
- 对变量和函数进行访问控制。
10、权限
struct
和class
是一个意思,不同的是默认权限。struct默认是public,class默认是private
10.1 私有方法private
- 私有的属性只有在类的内部才能访问。
10.2 保护权限protected
类的内部和子类可以访问,外部不能访问。
10.3 将成员设置成private
- 建议将
所有的成员
属性设置成私有属性
;- 便于在设置
读写权限
;在类的公共中设置读取写入的函数。- 可以对输入进行
判断
。通过类中的公共方法对输入的值进行判断区分。
11、const
const
对象不能调用非const
成员函数;非const
对象阔以调用const
成员函数;
const一般用于
成员
函数,限制成员
函数不能对类的数据进行修改;
class A {public:A(int a=0) : m_a(a) {}~A(){}int getA() const { return m_a; }
private:int m_a;
};
11.1 const是否会影响函数重载
若出现const出现修饰于函数体,则可被视为函数重载;
class A {public:A(int a=0) : m_a(a) {}~A(){}int getA() const { return m_a; } void func(int& a) const {};void func(int& a) {}private:int m_a;
};
C++ |【01】面向对象基础内容、引用、函数重载等....相关推荐
- c 语言重载参数类型不同重载和,C++基础学习之函数重载的简单介绍
前言 我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同.例如:交换两个数的值其中包括(int, float,char,double)这些个类型.在C语言中我们是利用不同的函数 ...
- JAVA面向对象的总结(函数重载与数组)
函数重载 定义:在一个类中存在两个或者两个以上的同名函数,这些函数就叫做函数的重载 作用:同一个函数名可以出现不同的函数,以应对个数或者数据类型不同的参数 要求:1.函数名一致 2.形式列表不一致(对 ...
- getline没有与参数列表匹配的重载函数_C++新增基础功能解析—函数重载功能的使用...
喜欢的可以收藏转发加关注 "函数重载"指的是可以有多个同名的函数,因此 名称进行了重载.这两个术语指的是同一回事,但我们通常使用函数重载.可以通过函数重载来设计• 系列函数--它们 ...
- C++基础教程之函数重载,什么是C++函数重载?
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同.例如希望交换两个变量的值,这两个变量有多种类型,可以是 int.float.char.bool 等,我们需要通过参数把变量的地址传 ...
- Java第五天笔记01——面向对象基础
目录 1.面向过程和面向对象的编程思想 2.类的定义 3.成员变量.局部变量.静态变量的区别 4.类和对象的关系 5.对象的创建 6.创建对象原理 7.垃圾回收机制 8.构造方法 9.Java包 10 ...
- C++基础知识 —— 内存分区模型、引用、函数重载、类和继承、this指针、友元、多态、文件操作
参考 黑马程序员 C++课程笔记,个人理解及整理 可以使用 在线编译c++代码 来简单验证.学习代码 目录 C++核心编程 1. 内存分区模型 1.1 程序运行前 1.2 程序运行后 1.3 ...
- C++ 基础 : 函数重载、引用、内联函数、auto、范围for循环
函数重载 引用 内联函数 auto 范围for循环 函数重载 C++中引入了一个新特性,函数重载. 在同一个作用域下,对于相同的函数名,函数的参数不同,不同类型的参数顺序不同,参数的个数不同,都可以形 ...
- 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)
0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...
- JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)
第1节 面向对象基础 一.面向对象思想 1.1 概述 面向对象(Object Oriented)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算 ...
最新文章
- Android进程优先级和垃圾回收机制
- 002_JavaScript的历史
- d+java.ext.dirs_Java-JDK9-Djava.ext.dirs is not supported
- c#中的非托管资源释放 (Finalize和Dispose)
- 【hihocoder - offer编程练习赛60 A】hohahola(贪心,二分)
- 【转载】移植FFMpeg到VC环境心得
- 解决重启centos后resolv.conf总被清空的问题
- 虚拟ip是什么意思_轻松了解基于Ip,Mac,组播的Valn是什么意思,通信基础第17篇...
- cmake常用语法参考
- 环境变量PATH cp命令 mv命令 文档查看cat/more/less/head/tail
- JQuery 四个常用的DOM操作获得内容 - text()、html()、value 以及 val() ;取属性值attr()----前三个有回调函数
- JS中的this指向
- (翻译)线框图和设计原型图之间的区别是什么?
- 卓有成效的管理者—第一章 卓有成效是可以学会的
- mysql 1055 - Expression 解决
- 【[中文直播] 第21期 | UE4数据驱动开发 | Epic 大钊】课程笔记
- 【GNN应用】金融风控领域
- API接口管理平台-rap
- 芯片验证漫游指南_IC验证入门资料
- javascript判断常用浏览器版本和类型兼容处理