首页 > 系统相关 >c++面向对象概述、内存分析、引用、函数

c++面向对象概述、内存分析、引用、函数

时间:2022-10-09 20:36:17浏览次数:58  
标签:10 include cout int c++ 面向对象 内存 main 函数


1.c++内存分区模型

c++程序在运行的过程中,内存会被划分为以下四个分区

代码区:程序的所有程序的二进制代码,包括注释会被放到此区

全局区:存放静态变量、全局变量、常量(字符串常量和const修饰的常量),此区的数据将在程序结束后由操作系统释放

using namespace std;
//不在任何函数内的变量是全局变量
int a = 10;
int b = 23;

int main() {
//在某个函数内的变量
int c = 12;
cout << (int)&a << endl;
cout << (int)&b << endl;
cout << (int)&c << endl;

}

栈区:用于存放局部变量、函数参数等,是由编译器自动释放和分配,所以不能让栈区返回一个地址,

#include <iostream>
#include <string>
using namespace std;

int* f() {
int a = 10;
return &a;//栈区不要返回地址。局部变量是由编译器自动释放和分配
}
int main() {

int* p = f();
cout << *p;//10 第一次编译器会做保留
cout << *p;//不会打印10
}

堆区:存储对象(使用new操作符,后面会介绍)由程序员分配释放,若我们不释放,程序结束由操作系统释放

c++中通过new关键字将数据开辟到堆区

#include <iostream>
using namespace std;
int* f() {
/*
*1.指针本身也是局部变量,存放在栈长中,但是保存的数据在堆中
2.new关键字开辟一块堆区,返回的是该数据类型的指针
*/
int *a = new int(10);
return a;
}
int main() {
int* p = f();
cout << *p;//10
cout << *p;//10
//3.堆区的数据程,序员可以通过该delete释放
delete p;
//cout << *p;异常
}

 如果是new一个数组

//new一个数组
int* arr = new int[10];
//释放一个数组
delete[] arr;

注意

代码区和全局区是程序编译成exe可执行文件的时候就已经有了,但是栈区和堆区是程序exe文件执行后产生的

2.为什么划分内存(内存划分意义)

将不同的数据放在不同的区域,赋予不同的生命周期,提高编程灵活程度

3.引用

使用引用给一个变量起别名

#include <iostream>
using namespace std;

int main() {
int a = 10;
/*1.定义引用的格式 数据类型 &别名=原名
*2.引用必需要初始化
*3.引用初始化后,不可更改
*/
int& b = a;
cout << b;//10
}

前面文章中的地址传递会修改实参,值传递不会修改实参,引用作为函数参数会修改实参,简化使用指针修改实参的复杂过程

#include <iostream>
using namespace std;
void swap(int &a,int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
swap(a,b);
cout << a;//20
cout << b;//10
}

 局部变量不能作为函数的返回值返回

#include <iostream>
using namespace std;
int& f() {
int a = 10;//栈区中的局部变量在函数执行完后释放
return a;
}
int main() {
int &a = f();
cout << a;//10 编译器保留
cout << a;//不在是10
}

如果是局部静态变量,可以返回

#include <iostream>
using namespace std;
int& f() {
static int a = 10;//栈区中的局部变量在函数执行完后释放
return a;
}
int main() {
int &a = f();
cout << a;//10
cout << a;//10
}
#include <iostream>
using namespace std;
int& f() {
static int a = 10;//栈区中的局部变量在函数执行完后释放
return a;
}
int main() {
int &a = f();
cout << a;//10
cout << a;//10
f() = 100;//如果函数的返回是一个引用,可以作为左值
cout << a;//100
cout << a;//100
}

引用本质是指针常量

int main() {  
int a = 1;
//内部发现是引用,自动转成指针常量 int * const b=&a;
int& b = a;
b = 2;//内部发现是引用,自动转成*b=20;
cout << a;//2
cout << b;//2
}

 常量引用

#include <iostream>
using namespace std;
//使用const修改函数形参,防止误操作
void f(const int& a) {
//a = 100;不允许修改
}
int main() {
int& b = 1;//引用本身需要一个合法内存空间,所以这行代码有误
int a = 10;
f(a);
}

 

4.函数相关

前面c++基础系列有关函数知识有所描述,这里补充一些函数高级知识

1.c++中函数可以有默认值

#include <iostream>
using namespace std;
//1.c++中函数可以有默认值,并且某个位置有了默认值,那么从这个位置开始左到右都的有默认值
int f(int a, int b = 10,int c=20) {
return a + b + c;
}
int main() {
int a = 10;
//2.如果函数有默认值,当我们传值使用传递的值,不传值使用默认的
cout<<f(a);//40
cout << f(a, 20);//50
}
//3.声明和实现只能有一个有默认参数
int f1(int a, int b = 10);
int f1(int a, int b) {
return a + b;
}

2.c++函数中可以有占位参数用来占位,调用函数必需填补该位置

#include <iostream>
using namespace std;

//1.只写一个数据类型就是占位
void f(int a,int) {
cout << "test";
}
//2.占位参数可以有默认值
void f1(int a, int=10) {
cout << "test";
}
int main() {
int a = 10;
f(a, 10);//占位参必须填补
}

3.函数重载

定义:同一个作用域下,两个函数参数类型不同或者参数顺序不同或者个数不同。此时这两个函数名字可以相同。提高复用性

#include <iostream>
using namespace std;

void f(int a,int b) {
cout << "test";
}

void f(int a) {
cout << "test";
}
int main() {
int a = 10;
f(a, 10);
}

注意:函数返回值不能作为函数重载的条件

4.引用也可作为函数重载条件

#include <iostream>
using namespace std;

void f(int &a) {//int &a=10;不合法
cout << "test";
}

void f(const int &a) {//const int &a=10;合法
cout << "test111";
}
int main() {
int a = 10;
f(a);//test
f(10);//test111
}

5.函数重载遇到默认参数需要注意

void f(int a,int b=10) {//int &a=10;不合法
cout << "test";
}

void f(int a) {//const int &a=10;合法
cout << "test111";
}
int main() {
int a = 10;
f(a);//报错,出现二义性
}

c++面向对象概述、内存分析、引用、函数_#include

标签:10,include,cout,int,c++,面向对象,内存,main,函数
From: https://blog.51cto.com/u_11334685/5741386

相关文章

  • C++函数
    目录​​函数作用​​​​函数定义​​​​函数声明​​​​函数调用​​​​函数值传递​​​​函数常见的样式​​​​函数的分文件书写​​函数作用将经常使用的代码封装......
  • C++数据类型
    目录 ​​1.数据类型概述​​​​2.基本的内置类型​​​​整型​​​​实型(浮点型)​​​​字符型​​​​转义字符​​​​字符串型​​​​c风格的字符串​​​​c++风......
  • C++数组
    概述C++支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。数组的声明并不是声明一个个......
  • C++运算符
    目录 ​​算术运算符(进行四则运算)​​​​赋值运算符(表达式的值赋给变量)​​​​比较运算符(表达是比较,返回一个真值或假值)​​​​逻辑运算符(返回表格式的结果真或......
  • rdr安装使用(redis内存分析工具)
    rdr安装使用1、下载wgethttps://github.com/xueqiu/rdr/releases/download/v0.0.1/rdr-linux 2、加权限chmoda+x./rdr*./rdr-linuxshow-p8080dump.rdb  3......
  • C++注释、变量、常量、关键字、标识符、输入输出
    目录​​1.注释​​​​注释作用​​​​注释的方式​​​​2.变量​​​​变量基本知识​​​​定义变量​​​​3.常量​​​​常量基本知识​​​​整数常量​​​​浮点......
  • c++开发环境搭建、visual studio安装
    1.C++简介C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。C++被认为是一种中级语言,它综合了高级语言......
  • c++ calendaring system
    c++calendaringsystemDefineandimplementacollectionofclassesthatmodelaneventhierarchyforacalendaringsystem.Yourdesignwillincludethebasec......
  • rdbtools 工具使用(redis内存分析)
    1、安装不要使用python3,用centos自带的python2版本,我使用Python3安装有问题。yuminstallpython-develpipinstallpython-lzf gitclonehttps://github.com/sripa......
  • python调用c++的方法,加速运算
    cpp源代码#include"iostream"usingnamespacestd;classCalc{public:intadd(inta,intb);};intCalc::add(inta,intb){cout<<"收到参数为a,b:"<<a<......