变量范围
#include<iostream>
using namespace std;
int* func(){
int a=100;//局部变量,放在栈区中,在函数执行完后释放
return &a;//尽量不要返回局部变量的地址
}
int* func2(){
//利用new关键字,可将数据开辟到堆区
int* p=new int(10);//这里会返回一个地址
return p;
}
void func3(){
int* arr=new int[10];//在堆区创建一个数组
for(int i=0;i<10;i++){
arr[i]=i+100;
}
for(int i=0;i<10;i++){
cout<<arr[i]<<endl;
}
//释放数组
delete[] arr;
}
int main(){
int* p=func();
cout<<*p<<endl;//第一次保留
cout<<*p<<endl;//第二次不再保留
int* p2=func2();
cout<<*p2<<endl;
cout<<*p2<<endl;
//堆区的数据由程序员管理开辟和释放
delete p;//释放
//再次访问就是非法操作
return 0;
}
引用
#include<iostream>
using namespace std;
//引用传递函数
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
//引用作为函数的返回值
int& test1(){
int a=10;//局部变量存放在栈区
return a;
}
int& test2(){
static int a=10;//静态变量存放在全局区,在程序结束后由系统释放
return a;
}
void show(const int &val){
//val=1000;//这里会对形参发生改动,需要在形参前加const
cout<<"val="<<val<<endl;
}
int main(){
//引用本质是取别名
//基本语法
int a=10;
int &b=a;
cout<<b<<endl;
b=100;
cout<<a<<endl;//a也被修改
//注意引用必须要初始化,且一经初始化就不可修改
int x=10;
int y=20;
swap(x,y);//会交换两者的值,所以引用传递形参会修饰实参
//相当于给传入的x和y起了a和b的别名,用别名操作修改和用原名操作修改是一样的
int &ref=test1();
cout<<ref<<endl;
int &ref2=test2();
cout<<ref2<<endl;
//可作左值
test2()=1000;
cout<<ref2<<endl;//输出1000,因为ref是a的别名
int c=10;
int& ref3=c;//自动转换为int* const ref=&a,指针常量指向不可修改,所以引用不可修改
ref=20;//*ref=20
//常量引用: 用于修饰形参,防止误操作
//因为int& ref=10是不合法的
const int& ref4=10;//int temp=10; const int& ref4=temp;
//且不可修改
int num=10;
show(num);
return 0;
}
函数拓展
#include<iostream>
using namespace std;
//函数默认参数
int func(int a,int b=20,int c=30){//注意:如果某个位置已经有了默认参数,则从这个位置往后都有默认参数
return a+b+c;
}
//占位参数:只写一个数据类型.且占位参数还可以是默认参数
void func3(int a,int =10){
cout<<"this is func"<<endl;
}
//函数重载:可以让函数名相同,提高复用性
//满足条件:必须在同一个作用域下,且函数参数类型或则个数或者顺序不同
//注意返回值不同不可作为重载的条件
void fun(){
cout<<"fun调用"<<endl;
}
void fun(double a){
cout<<"fun"<<a<<endl;
}
//引用作为重载的条件
void fun(int &a){
cout<<"fun(&a)"<<endl;
}
void fun(const int &a){
cout<<"fun(const &a)"<<endl;
}
int main(){
cout<<func(10)<<endl;
cout<<func(10,30)<<endl;//如果传入已经默认的值,会用传入值进行操作
int func2(int a=10,int b=20);//声明和实现只能有一个传入默认参数
func3(10,10);//必须传入占位参数才能使用,有默认值可以不用传
fun();
fun(13.5);
int a=10;
fun(a);//会走第三个fun
fun(10);//会走第4个fun
//注意:当函数重载遇见默认参数,可能会出现二义性,尽量避免
return 0;
}
int func2(int a,int b){
return a+b;
}
类和对象
#include<iostream>
using namespace std;
const double PI=3.14;
//设计一个圆类,求周长
class Circle{
//访问权限
public://公共权限
//属性
int r;//半径
//行为
//获取周长
double calcLong(){
return 2*PI*r;
}
};
//设计学生类
class Student{
public:
string name;
int id;
void showStu(){
cout<<"姓名:"<<name<<"学号:"<<id<<endl;
}
//给姓名赋值
void setName(string sName){
name=sName;
}
//给学号赋值
void setId(int sId){
id=sId;
}
};
int main(){
//创建具体的圆
Circle c1;
//赋值
c1.r=10;
cout<<"圆的周长为:"<<c1.calcLong()<<endl;
//创建一个具体的学生
Student s1;
s1.setName("Curry");
s1.setId(30);
s1.showStu();
return 0;
}