admin管理员组文章数量:1599283
这里写目录标题
- 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;
}
案例
- 五只小猪称体重
在一个数组中找到最大值
#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;
}
- 数组元素逆置
#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;
}
- 冒泡排序
最常用的数组排序方法——比较相邻元素
#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修饰指针
-
const修饰指针——常量指针
const int * p = &a
,特点:指针的指向可以修改,但是指针指向的值不可以改*p = 20 ❌
p = &b
本文标签: 基础
版权声明:本文标题:C++编程基础 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728314262a1153380.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论