Day6-C++基础之引用、类和对象

变量范围

#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;
}
  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值