C++笔记 上
创建项目,创建文件,编写代码,运行程序
Helloworld
#include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; system("pause"); return 0; }
变量的使用
1.方便管理内存空间
2.变量创建的语法
常量
记录程序中不可以更改的数据
#define 常量名 常量 //宏常量
const 数据类型 常量名 =常量 //const修饰的变量
常量不能修改
内存四区
代码区
存放函数体的二进制代码,由操作系统进行管理
全局区
存放全局变量和静态变量以及常量
const修饰的
函数外定义的全局变量
static定义的
栈区
由编译器自动分配释放,存放函数的参数值,局部变量
形参在栈区
注意事项:
不要返回栈区的地址
存放在了栈区,函数执行完了之后释放
第一次解引用时可以取到数据,因为编译器做了保留,第二次不可以
堆区
由程序员分配和释放,若程序员不释放,程序结束由操作系统回收
利用new可以在堆区开辟数据
分区是为了灵活编程,生存周期不一样
程序执行前有代码区和全局区
代码区是共享和可读的
new
int *p=new int(10);
int* func(){
int *p=new int(10);//指针本质上也是局部变量,放在栈上,指针对应的数据在堆区
return p;
}
int main(){
//在堆区开辟数据
int *p=func();
}
delete p;
创建数组
int *arr=new int[10];
for(int =0;i<10;i++){
arr[i]=i+100;
}
delete[] arr;
C++中的引用
1.
给变量起一个别名
int a=10;
数据类型 &别名=原名;
注意事项
引用必须初始化,不能int &b;
初始化之后就不能改变了,不能变更成c的别名
引用做函数参数
有值传递和地址传递
值传递不可以修饰实参,地址传递可以
地址传递
void myswap0(int *a,int *b){ • int temp=*a; • *a=*b; • *b=temp; } myswap(&a,&b);
传地址,用指针接收
引用传递
void myswap(int &a,int &b){ int temp=a; a=b; b=temp; } myswap(a,b);
引用做函数的返回值
不要返回局部变量的引用
函数的调用可以作为左值
int& test01(){ • int a=10; • return 0; } int main(){ • int &ref=test01(); } //不要返回局部变量的引用
第一次正确,编译器做了保留,第二次不行
int& test02(){ static int a=10; //静态变量 return 0; } int &ref2=test02(); test02()=1000; //可以作为左值
函数的返回值是引用,这个函数调用可以作为左值
引用的本质
本质在C++内部的实现是一个指针常量
int& ref=a;
内部转换为int *const ref=&a;
ref=20;
内部会发现是引用,自动为我们转换为*ref=20;
本质是指针常量
所有的指针的操作都是编译器帮我们做了
常量引用
堆区和栈区都是可以直接引用的,引用必须引用一块合法的空间
int &ref=10;是错误的
const int &ref=10;是正确的
const int &ref=10;编译器做的操作是int temp=10;const int &ref=temp;
加入const之后是只读不可修改
使用场景
int a=100;
void showValue(const int &Val){
//Val会报错
cout <<Val<<endl;
}
函数高级
函数的默认参数
返回值类型 函数(数据类型 变量名=默认值)
注意
1.某个位置有了默认参数,这个位置从左向右都必须有默认值
2.没有传入就是默认值,传入就是传入的数据
3.函数的声明有默认的参数,函数的实现就不能有默认的参数了
声明和实现只能有一个有默认参数
函数占位参数
void func(int a,int){ cout <<“this is func”<<endl; } func(10,10);