admin管理员组

文章数量:1598910

这里写目录标题

  • 1. 基础
    • 1.1数组
    • 1.2 函数
    • 1.3指针
    • 1.4结构体
    • 1.5案例——通讯录管理系统
      • 通讯录管理系统
        • 系统需求
        • 菜单功能
        • 退出功能
        • 添加联系人
        • 显示联系人
        • 删除联系人
        • 查找联系人
        • 修改联系人
        • 清空联系人
  • 2 核心编程
    • 2.1 内存分区模型
      • 2.1.1 程序运行前
      • 2.1.2 程序运行后
        • 栈区
        • 堆区
      • 1.3 new 操作符
    • 2.2 引用
      • 2.2.1 定义
      • 2.2.2 引用注意事项
      • 2.2.3 引用做函数参数
      • 2.2.4 引用做函数的返回值
      • 2.2.5 引用的本质
      • 2.2.6 常量引用
    • 2.3 函数提高
      • 2.3.1 函数默认参数
      • 2.3.2 函数占位参数
      • 2.3.3 函数重载
        • 函数重载概述
        • 函数重载注意事项
    • 2.4 类和对象
      • 2.4.1 封装
        • 封装的意义
        • struct和class区别
        • 成员属性设置为私有
        • 练习
      • 4.2对象的初始化和清理
        • 4.2.1构造函数和析构函数
        • 4.2.2构造函数的分类及调用
        • 4.2.3 拷贝构造函数调用时机
        • 4.2.4 构造函数调用规则
        • 4.2.5 深拷贝与浅拷贝
        • 4.2.6初始化列表
        • 4.2.7类对象作为类成员
        • 4.2.8静态成员
      • 4.3 C++对象模型和this指针
        • 4.3.1成员变量和成员函数分开存储
        • 4.3.2 this指针概念
        • 4.3.3空指针访问成员函数
        • 4.3.4 const修饰成员函数
      • 4.4 友元
        • 4.4.1 全局函教做友元
        • 4.4.2 类做友元
        • 4.4.3 成员函数做友元
      • 4.5 运算符重载
        • 4.5.1加号运算符重载
        • 4.5.2 左移运算符重载
        • 4.5.3递增运算符重载
        • 4.5.4赋值运算符重载
        • 4.5.5 关系运算符重载
        • 4.5.6 函数调用运算符重载

1. 基础

1.1数组

array:放在连续内存空间内,每个元素是相同类型

一维定义方式

  • 数据类型 数组名[数组长度];
  • 数据类型 数组名[数组长度]={值1,值2…};
  • 数据类型 数组名[]={值1,值2…};

通过下标访问数组中的元素,数组元素下标是从0开始

//1
int arr[3];
arr[0] = 12;
arr[1] = 22;
arr[2] = 32;
cout<<arr[2]<<endl;
//2
int arr2[3] = {12,22,32};
for(i=0;i<3;i++)
{
    cout<<arr[i]<<endl;
}
//3

一维数组数组名

可以统计整个数组在内存中的长度;sizeof(arr)

可以获取数组在内存中的首地址;cout<<arr<<endl

数组名是常量,不能幅值:arr=100 ❌

#include<iostream>
using namespace std;
int main(){
    int arr[10]={1,2,3,4,5,6,7,8,9,0};//int类型 4个字节
    cout<<"整个数组在内存中的长度"<sizeof(arr)<<endl;
    cout<<"1个数组在内存中的长度"<sizeof(arr[0])<<endl;
    cout<<"整个数组的元素个数"<sizeof(arr)/sizeof(arr[0])<<endl;
    
    cout<<"数组首地址为:"<<(int)arr<<endl;
    cout<<"数组第一个元素的地址为:"<<(int)&arr[0]<<endl;
    cout<<"数组第二个元素的地址为:"<<(int)&arr[1]<<endl;
    system("pause");
    return 0;
}

案例

  1. 五只小猪称体重

在一个数组中找到最大值

#include<iostream>
using namespace std;
int main(){
    int arr[5]={300,350,200,400,250};
    int max=0;
    for(i=0;i<5;i++)
    {
        if(arr[i]>max)
        {
            max=arr[i];
        }
    }
    cout<<"the most heavy"<<max<<endl;
    system("pause");
    return 0;
}
  1. 数组元素逆置
#include<iostream>
using namespace std;
int main(){
    int arr[5]={1,3,2,5,4}
    cout<<"before tranpose"<<endl;
    for(i=0;i<5;i++)
    {
        cout<<arr[i]<<endl;
    }
    while(start<end)
    {
        int start=0;//起始元素下标
        int end =sizeof(arr)/sizeof(arr[0]-1);//末尾元素下标
        int temp=arr[start];
        arr[start]=arr[end];
        arr[end]=temp;//exchange items
        start++;
        end--;//update items
    }
    cout<<"after transpose"<<endl;
    for(i=0;i<5;i++)
    {
        cout<<arr[i]<<endl;
    }
    system("pasuse");
    return 0;
}
  1. 冒泡排序

最常用的数组排序方法——比较相邻元素

#include<iostream>
using namespace std;
int main(){
    int arr[9]={2,4,1,3,7,5,9,6,8};
    cout<<"排序前"<<endl;
    for(i=0;i<9;i++)
    {
        cout<<arr[i]<<"";
    }
    cout<<endl;
    //排序总轮数为元素个数减一;每轮比较次数为`元素个数-排序轮数-1`
    for(int i=0;i<9;i++)
    {
        //内层循环比较
        for(int j=0;j<9-i-1;j++)
        {
            //依次比较相邻元素
            if(arr[j]>arr[j+1])
            {
                int temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    cout<<"排序后"<<endl;
    for(i=0;i<9;i++)
    {
        cout<<arr[i]<<"";
    }
    cout<<endl;
    system("pasuse");
    return 0;
}

二维数组定义方式

  • 数据类型 数组名[ 行数 ] [列数];
  • 数据类型 数组名[ 行数 ] [列数]={ {值1,值2…},{值1,值2}…};//更直观
  • 数据类型 数组名[ 行数 ] [列数]={值1,值2,值3,值4};
  • 数据类型 数组名[ ] [列数]={值1,值2,值3,值4};

二维数组数组名

  • 查看二维数组所占内存空间
  • 获取二维数组首地址
#include<iostream>
using namespace std;
int main(){
    int arr[2][3]={
  {1,3,5},{2,4,6}}
    cout<<"二维数组占用的内存空间"<<sizeof(arr)<<endl;
    cout<<"二维数组第一行占用的内存空间"<<sizeof(arr[0])<<endl;
    cout<<"二维数组第一个元素占用的内存空间"<<sizeof(arr[0][0])<<endl;
    cout<<"二维数组的行数"<<sizeof(arr)/sizeof(arr[0])<<endl;
    cout<<"二维数组的列数"<<sizeof(arr[0])/sizeof(arr[0][0])<<endl;
    cout<<"二维数组的首地址"<<(int)arr<<endl;//强转为十进制
    cout<<"二维数组第一行首地址"<<(int)arr[0]<<endl;
    cout<<"二维数组第二行首地址"<<(int)arr[1]<<endl;
    cout<<"二维数组第二行首地址"<<(int)&arr[0][0]<<endl;//取址符
    system("pasuse");
    return 0;
}

案例

考试成绩统计,输出总成绩

#include<iostream>
using namespace std;
#include string;
int main(){
    int sores[3][3]={
  {100,100,100},{90,50,100},{60,70,80}}
    string names[3]={张三,李四,王五};//include string
    for(int i=0;i<3;i++)
    {
        int sum=0;
        for(int j=0;j<3;j++)
        {
            sum+=sores[i][j]
            cout<<sores[i][j]<<" ";
        }
        cout<<names[i]<<"的分数"<<sum<<endl;
    }
    system("pasuse");
    return 0;
}

1.2 函数

作用:将一段经常使用的代码封装起来减少重复代码

​ 一个较大的程序分为若干模块以实现不同功能

函数的定义

  • 返回值类型
  • 函数名
  • 参数列表
  • 函数体语句
  • return表达式
返回值类型 函数名 (参数列表)//main 函数参数列表不用传入数据
{
    函数体语句
        
    return表达式
}

函数的调用

语法:函数名(参数)

int add (int num1,int num2)//定义加法函数
{
    int sum = num1 + num2;
    return sum;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = add(a, b);//a,b叫做实参,传递给形参num1,num2
	cout << "c=" << c << endl;
	system("pause");
    return 0;
}

值传递

  • 函数调用时实参将数值传入形参
  • 值传递时,形参发生变化不会影响实参
//如果函数不需要返回值,声明的时候可以用void
void swap(int num1, int num2)
{
	cout << "交换前:" << endl;
	cout << "number1=" << num1 << endl;
	cout << "number2=" << num2 << endl;
	int temp = num1;
	num1 = num2;
	num2 = temp;
	cout << "交换后:" << endl;
	cout << "number1=" << num1 << endl;
	cout << "number2=" << num2 << endl;
}
int main()
{
	int a = 10;
	int b = 20;
	swap(a, b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	system("pause");
	return 0;
}

函数的常见样式

  • 无参无返

  • 有参无返

  • 无参有返

  • 有参有返

void test01()
{
	cout << "test01" << endl;
}
void test02(int a)
{
	cout << "test02 a=" <<a<< endl;
}
int test03()
{
	cout << "test03 "  << endl;
	return 1000;
}
int test04(int a)
{
	cout << "test04 " << endl;
	return a;
}
int main()
{
	test01();
	test02(100);
	int number1 = test03();
	cout << "number1= " << number1<<endl;
	int number2 = test04(1222);
	cout << "number2= " << number2 << endl;
	system("pause");
	return 0;
}

函数的声明

作用:告诉编译器函数的名称和如何调用,函数的实际主体可以单独定义

  • 函数的声明可以多次,但是函数的定义只能有一次
//比较函数,返回较大值
int max(int a, int b)
{
	return a > b ? a : b;
}
int main()
{
	int a = 10;
	int b = 30;
	cout << max(a, b) << endl;
	system("pause");
	return 0;
}
int max(int a, int b);//函数的声明

int main()
{
	int a = 10;
	int b = 30;
	cout << max(a, b) << endl;
	system("pause");
	return 0;
}
//比较函数,返回较大值
int max(int a, int b)
{
	return a > b ? a : b;
}

函数的分文件编写

作用:让代码结构更加清晰

步骤:

  • 创建后缀名为.h的头文件
  • 创建后缀名为.cpp的文件
  • 在头文件中写函数的声明
  • 在源文件中写函数的定义
==swap.h==
#include <iostream>;
using namespace std;
void swap(int num1, int num2);//函数的声明
==swap.cpp==
 #include"swap.h"
void swap(int num1, int num2)
{
	int temp = num1;
	num1 = num2;
	num2 = temp;
}
==function.cpp==
#include<iostream>
using namespace std;
#include "swap.h";
int main() {
	int a = 10;int b = 20;
	swap(a, b);
	system("pause");
	return 0;
}

一些快捷键

ctrl+s储存

windows+space=切换输入法

shift+字母=大写

对齐代码Ctrl a+k+f

注释:ctrl+k,ctrl+c

取消注释:ctrl+k,ctrl+u

1.3指针

指针的基本概念

指针就是一个地址

作用:通过指针访问内存——利用指针变量保存内存地址

指针变量的定义和使用

1.定义指针数据变量 * 变量名

2.使用指针:通过**解引用***的方式找到指针指向的内存

//1.定义指针 
int a=10;
int *p;
p = &a;//将a的地址给指针
cout << "adress of a" << &a <<endl;
cout << "指针p为"<< p <<endl;
//2.使用指针
*p = 1000;
cout << "adress of a" << &a <<endl;
cout << "指针p为"<< p <<endl;

指针所占的内存空间

在32位系统下占4个字节;在64位下占8个字节

int main()
{
    int a =10;
    int *p = &a;
    cout<<"sizeof(int *)="<<sizeof(int *)<<endl;
    cout<<"sizeof(float *)="<<sizeof(float *)<<endl;
    cout<<"sizeof(double *)="<<sizeof(double *)<<endl;
    cout<<"sizeof(char *)="<<sizeof(char *)<<endl;
}

空指针

定义:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存不能访问:0~255之间的内存编号是系统占用的

int main()
{   //1.初始化指针变量
    int * p = NULL;
    //2.空指针指向的内存不能访问
    cout << *p<<endl;
    system("pause");
	return;
}

野指针

int main()
{   //1.初始化指针变量
    int * p =(int *) 0x1100;
    //2.空指针指向的内存不能访问
    cout << *p<<endl;
    system("pause");
	return;
}//在程序中尽量避免出现野指针

const修饰指针

  1. const修饰指针——常量指针

    const int * p = &a ,特点:指针的指向可以修改,但是指针指向的值不可以改

    *p = 20 ❌

    p = &b

    本文标签: 基础