紧接(个人笔记)C/C++基础知识(二)
结构体
基本用法
用户自定义的数据类型,允许用户储存不同的数据类型
定义
struct 结构体名{结构体成员列表};
举例
#include <iostream>
#include <string>
using namespace std;
//定义结构体
struct student
{
string name;
int age;
};
int main()
{
//使用
student stu;
stu.name = "张三";
stu.age = 20;
cout << "姓名: " << stu.name << " 年龄:" << stu.age << endl;
system("pause");
return 0;
}
结构体数组
定义方式没变,但是创建变量时改变。
举例
#include <iostream>
#include <string>
using namespace std;
//定义结构体
struct student
{
string name;
int age;
};
int main()
{
//使用
student stu[2];
stu[0].name = "张三";
stu[0].age = 20;
stu[1].name = "李四";
stu[1].age = 18;
cout << "姓名: " << stu[0].name << " 年龄:" << stu[0].age << endl;
cout << "姓名: " << stu[1].name << " 年龄:" << stu[1].age << endl;
system("pause");
return 0;
}
结构体指针
定义方式一样,创建有所区别
注意访问成员变量的方式 “->”
#include <iostream>
#include <string>
using namespace std;
//定义结构体
struct student
{
string name;
int age;
};
int main()
{
//使用
student stu;
student* ptr = &stu;
ptr->name = "小芳";
ptr->age = 18;
cout << "姓名: " << ptr->name << " 年龄:" << ptr->age << endl;
system("pause");
return 0;
}
结构体嵌套结构体
利用两个“ .”进行访问成员列表即可
内存四区
- 编译生成的exe可执行文件,未执行该程序前为代码区和全局区
- 程序运行后,栈区和堆区
代码区
特点
- 存放函数体的二进制代码,由操作系统进行管理
- 共享----对于频繁被执行的程序,只需要一份代码即可
- 可读----不可写,安全性
- 存放CPU执行的机器指令
全局区
- 存放全局变量和静态变量以及常量(字符串常量和const修饰的全局变量)
- 该区域的数据在程序结束后由操作系统释放
- const修饰的局部变量不在全局区
栈区
注意,不要返回局部变量的地址
特点
- 局部变量存放在栈区,栈区的数据在函数执行完后自动释放
堆区
主要利用new在堆区开辟内存
语法:
开辟
new创建一个堆区的数据为整型的10,返回一个地址。让栈区的指针指向这个地址。
int* p = new int(10);
释放
释放new开辟的内存,用delete关键字
delete p; //变量
delete[] arr;//数组
引用
作用:给变量取别名
语法:数据类型 & 别名=原名;
注意:
- 引用必须初始化
- 一旦初始化,就不可以更改(引用很专一)
应用场景:作为函数的形参,可以修饰实参
引用用作函数参数
#include <iostream>
using namespace std;
//引用作为函数参数
void swap1(int &num1,int &num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
int main()
{
int a =10;
int b =100;
cout << "应用作为函数参数,交换前:" << endl;
cout << "a= " << a << " b= " << b << endl;
swap1(a, b);
cout << "应用作为函数参数,交换后:" << endl;
cout << "a= " << a << " b= " << b << endl;
system("pause");
return 0;
}
引用用作函数的返回值
1.不要返回局部变量的引用
#include <iostream>
using namespace std;
//返回局部变量的引用
int & add(int num1,int num2)
{
int sum = num1 + num2;
return sum;
}
int main()
{
int &c=add(10,10);
cout << c << endl;
cout << c << endl;//错误数据
system("pause");
return 0;
}
2.引用用作函数的返回值
#include <iostream>
using namespace std;
int & add(int num1,int num2)
{
//静态变量,在全局区
static int sum = num1 + num2;
return sum;
}
int main()
{
int &c=add(10,10);
cout << c << endl;
cout << c << endl;
add(10, 10) = 1000;
cout << c << endl;
cout << c << endl;
system("pause");
return 0;
}
3.引用的本质在c++内部的实现是一个指针常量
int &ref=a; //本质int *const ref =&a;
ref=20; //本质 *ref=20;
4.常量引用
const int &a=10;
函数提高
函数的形参列表可有默认参数
#include <iostream>
using namespace std;
int sum(int a, int b = 10, int c = 10)
{
return a + b + c;
}
int main()
{
int s = sum(10);
cout << s << endl;
system("pause");
return 0;
}
注意事项
1.默认参数从左到右必须全部初始化
(int a,int b,int c=10,int d=10)//从变量c开始后免得变量都必须初始化
2.函数的声明和定义,只能有一个有默认参数
函数的形参列表中可以有占位参数
在调用时必须补全
#include <iostream>
using namespace std;
int sum(int a, int b , int )
{
return a + b ;
}
int main()
{
//在调用时补全
int s = sum(10,20,10000);
int s1= sum(10, 20, 20000);
cout << "s= " << s << endl;
cout << "s1= " << s1 << endl;
system("pause");
return 0;
}
占位参数还可以有默认参数
#include <iostream>
using namespace std;
//占位参数有默认参数
int sum(int a, int b , int = 10 )
{
return a + b ;
}
int main()
{
//已有默认参数,不需要三个参数,写了三个也不报错
int s = sum(10,20);
int s1= sum(10,20);
cout << "s= " << s << endl;
cout << "s1= " << s1 << endl;
system("pause");
return 0;
}
函数重载
- 函数名可以相同,提高复用性
条件
- 同一作用域下(全局区)
- 函数名称一样
- 形参的顺序,数量不同,参数类型不同
返回值的类型不同不可做为重载条件
注意
1.引用作为重载的条件
#include <iostream>
using namespace std;
//1.函数在全局区
int add(int& a)
{
cout << "第一个函数:"<<endl;
int sum = 0;
sum *= a;
return sum;
}
//2.函数名一样
//3.参数类型不同
int add(const int& a)
{
cout << "第二个函数:" << endl;
int sum = 0;
sum += a;
return sum;
}
int main()
{
int a = 20;
cout << add(10) << endl; //此处调用的是第二个函数
cout << add(a) << endl; //此处调用的是第一个函数
system("pause");
return 0;
}
2.重载碰到默认参数
void func(int a,int b=10);
void func(int a);
func(10); //出现二义性,无法重载
func(10,20);//可以重载
【未完待续…博主持续总结中…】