首页 > 系统相关 >【C++基础篇】—— 面向对象编程前的准备(内存分区,引用、函数重载)

【C++基础篇】—— 面向对象编程前的准备(内存分区,引用、函数重载)

时间:2024-08-04 12:24:05浏览次数:12  
标签:10 func 函数 int void C++ 引用 面向对象编程 重载

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在本篇文章中,主要是对C++的基础语法进行回顾学习,回顾学习C++的基本语法规则、数据类型、控制结构以及面向对象编程的基本思想。

一、内存分区模型

1.C++内存分区

代码区
存放函数体的二进制代码,由操作系统进行管理的(代码区特点是共享和只读
a.存放 CPU 执行的机器指令
b.代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
c.代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区
存放全局变量和静态变量以及常量,该区域的数据在程序结束后由操作系统释放.

栈区
由编译器自动分配释放, 存放函数的参数值,局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放(容易出现野指针的情况)

堆区
程序员分配和释放,若程序员不释放,程序结束时由操作系统回收,在C++中主要利用new在堆区开辟内存

2. new操作符

作用:C++中利用new操作符在堆区开辟数据,手动释放,释放利用操作符 delete

语法:new 数据类型

注意:利用new创建的数据,会返回该数据对应的类型的指针
示例:

int * func()
{
	int * a = new int(10);
	return a;
}
int main()
{
	int * p = func();
	cout << *p << endl;
	//利用delete释放堆区数据
	delete p;
	system("pause");
	return 0;
}

二、引用

1.基本使用
作用:给变量起别名

语法:数据类型 &别名 = 原名

实例:

int a = 10;       int &b = a;

2.引用注意事项
a.引用必须初始化
b.引用在初始化后,不可以改变
示例:

int a = 10;    int b = 20;
//int &c;//错误,引用必须初始化
int &c = a;//一旦初始化后,就不可以更改
c = b;//这是赋值操作,不是更改引用

3.引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
示例:

//3.引用传递
void mySwap03(int & a,int & b)
{
	int temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 10; int b = 20;
	my Swap03(a, b);
	return 0;
}

总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单

4.引用做函数返回值
作用:引用是可以作为函数的返回值存在的
用法:函数调用作为左值
注意不要返回局部变量引用(因为调用完就内存被释放)
示例:

//返回局部变量引用
int &test01()
{   int a =10;return a;  }
//返回静态变量引用
int &test02()
{  static int a = 20; return a;}
int main()
{
	int &ref = test01();  //不能返回局部变量的引用
	int &ref2 = test02();
	return0;
}

5.引用的本质
本质:引用的本质在c++内部实现是一个指针常量(指向不能改,指向的值可以修改

6.常量引用
作用:常量引用主要用来修饰形参,防止误操作,在函数形参列表中,可以加const修饰形参,防止形参改变实参
示例:
void mySwap03(const int & a, const int & b)
{
int temp = a;
a = b;
b = temp;
}

三、函数重载

1.函数基本使用

(1) 函数默认参数
在C++中,函数的形参列表中的形参是可以有默认值的。

语法:返回值类型函数名(参数=默认值){}

注意
a.如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值

int func(int a, int b = 10,int c = 10)
{
	return a+b+c;
}
//错误的示例
void func(int a = 0, int b ,int c = 10){}   

(2) 函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置, (目前还体会不到作用,后面会详细介绍)
语法:返回值类型函数名(数据类型){}

2. 函数重载

(1) 函数重载的基本概述
作用:函数名可以相同,提高复用性
函数重载满足条件
a.同一个作用域下
b.函数名称相同
c.函数参数类型不同或者个数不同或者顺序不同
示例:

void func() {}                void func(int a) {}   
void func(double a) {}       void func(int a,double b) {}     
void func(double a,int b) {}

注意:函数返回值不可以作为函数重载条件

(2) 重载使用时的注意事项

a.引用作为重载条件
b.函数重载碰到函数默认参数

//引用作为重载条件
void func (int & a){}
void func (const int & a){}
//函数重载碰到函数默认参数
void func2(int a){}
void func2(int a, int b = 10){)
int main()
{
	int a = 10;
	func(a);    //调用无const 
	func(10);   //调用有const
    //func2(10);//碰到默认参数产生歧义,需要避免system("pause");
    return0;
}

标签:10,func,函数,int,void,C++,引用,面向对象编程,重载
From: https://blog.csdn.net/2401_82458959/article/details/140554182

相关文章

  • CPlusPlus - #034 C++ 中的零拷贝技术
    文章目录C++中的零拷贝技术探析1前言2.1使用mmap实现零拷贝2.2使用sendfile实现零拷贝2.3优缺点和适用场合2.3.1mmap2.3.1.1优点2.3.1.2缺点2.3.1.3适用场景2.3.2sendfile2.3.2.1优点2.3.2.2缺点2.3.2.3适用场景2.4总结......
  • 【C++ STL】vector
    文章目录vector1.vector的接口1.1默认成员函数1.2容量操作1.3访问操作1.4修改操作1.5vector与常见的数据结构的对比2.vector的模拟实现2.1类的定义2.2默认成员函数迭代器的分类2.3容量接口memcpy浅拷贝问题内存增长机制reserve和resize的区别2.4修改接口......
  • 基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理
    1.TCP/IP编程1.1概念IP是英文InternetProtocol(网络之间互连的协议)的缩写,也就是为计算机网络相互连接进行通信而设计的协议。任一系统,只要遵守IP协议就可以与因特网互连互通。所谓IP地址就是给每个遵循tcp/ip协议连接在Internet上的主机分配的一个32bit地址。按照TC......
  • 【leetcode详解】另一棵树的子树 (C++递归:思路精析&& 过程反思)
    思路详解:总体框架:对root树进行先序遍历,如果当前结点(记为cur)的值和subRoot的根节点值相等时,就开始判断 以cur为根节点的树和子树是否结构一样?如何判断两棵树是否结构完全相同?分析:一提到“树”结构,很容易想到在(先/中/后序)遍历上做文章,请教了AI后笔者得知,如果两棵树......
  • c++中的迭代器
    前言hello大家好,我是文宇。正文C++中的迭代器是一种访问容器中元素的对象。它可以看作是一种抽象的指针,通过迭代器可以便捷地遍历和操作容器中的元素,无需了解容器内部的数据结构和实现细节。迭代器提供了一组操作,包括指向容器中的元素、移动到下一个元素、访问当前元素等功......
  • 【每日一题】【并查集】【力扣】695.岛屿的最大面积 C++
    力扣695.岛屿的最大面积695.岛屿的最大面积题目描述给你一个大小为m×nm\timesnm×n的二进制矩阵......
  • C++ //练习 16.27 对下面每条带标签的语句,解释发生了什么样的实例化(如果有的话)。如果
    C++Primer(第5版)练习16.27练习16.27对下面每条带标签的语句,解释发生了什么样的实例化(如果有的话)。如果一个模板被实例化,解释为什么;如果未实例化,解释为什么没有。template<typenameT>classStack{};voidf1(Stack<char>); //(a)classExercise{ Stack<dou......
  • c动态加载c/c++ so并调用其中的函数或者子类实现
    在不少服务器应用中,会采用插件化或者模块化的体系实现具体的业务功能,比如mysql支持插件化体系,nginx采用模块化体系。总得来说,很多时候,因为扩展性,系统会采用动态加载so的方式扩展业务功能,而主框架不需要每次新增功能就不得不重新编译,很多时候,对于二进制发行的应用来说,不可能这......
  • C++ //练习 15.31 已知s1、s2、s3和s4都是string,判断下面的表达式分别创建了什么样的
    C++Primer(第5版)练习15.31练习15.31已知s1、s2、s3和s4都是string,判断下面的表达式分别创建了什么样的对象:(a)Query(s1)|Query(s2)&~Query(s3);(b)Query(s1)|(Query(s2)&~Query(s3));(c)(Query(s1)&(Query(s2))|(Query(s3)&Query(s4)));......
  • C++ //练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。
    C++Primer(第5版)练习16.14练习16.14编写Screen类模板,用非类型参数定义Screen的高和宽。环境:LinuxUbuntu(云服务器)工具:vim 代码块template<intH,intW>classScreen{public:usingpos=string::size_type;Screen()=default;Screen(cha......