C++ |【01】面向对象基础内容、引用、函数重载等....

一、概述

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、权限
  • structclass是一个意思,不同的是默认权限。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;
};
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值