c++day2 const

C++中const与引用的深入解析
本文围绕C++展开,介绍了const的多种使用方式,如修饰指针、常量等,指出C++编译器对const的处理机制及分配内存时间。还阐述了const与宏定义的区别,包括处理阶段、作用域等。此外,详细讲解了引用的概念、语法、用途、本质,以及引用在不同场景下的使用注意事项。

void main01()
{
    const int a;
    int const b;//一样

    const int *c;//const修饰的是指针所指向的内存空间不能被修改
    int * const d;//值不可以被修改
    const int * const e;//指针不可以被修改
    cout<<"hello.."<<endl;
    system("pause");
    return ;
}


//说明C语言中的const存在缺陷,可以间接修改,而在C++里面,a的值是10
void main02()
{
    //好像a是一个常量
    const int a =10;
    //a  = 11;
    int *p = NULL;
    p = (int *)&a;

    *p = 20;//间接赋值
    printf("%d\n",a);
    //cout<<a<<endl;
}

C++编译器对const的处理,虽然可能为const常量分配空间,但是不会使用其存储空间内的值。其实是一个类似map的符号表,当用到的时候就会从表中读取,是不会变的

const分配内存的时间是编译器编译期间。

void main03()
{
    int a ;
    const int b;
    int c;
    printf("%d,%d,%d\n",&a,&b,&c);
//打印结果是三个连续的内存地址

    system("pause");


}


04const的用途
宏定义的手段,
//下面的代码如果不用const就会报错
int main04()
{
    const int a=1;
    const int b=2;
    int array[a+b] ={0};
    int i=0;
    for(i=0;i<(a+b);i++)
    {
        printf("array[%d]=%d\n",i,array[i]);    
    }    
    
    printf("press enter to continue...");
    getchar();
    
    return 0;
}


//注意,如果是linux内核里的编码,不加const也可以编译通过,这是由于gcc编译器的支持,但是c和c++都不支持这种不安全的写法。

#define是预处理,但是const是编译处理,这是区别


05const定义的变量,由编译器处理提供类型检查和作用域检查
#define作用域比const大,const的作用域很确切。


引用
a)在c++中引入了引用的概念
b)引用可以看作是已经定义变量的别名
c)引用的语法是 :Type& name = var;
d)引用作为函数参数声明时候不进行初始化。

#include <iostream>
using namespace std;

void main(){
    int a =10;
    //引用
    int &b =a ;
    
    b=100;

    printf("b:%d\n",b);
    printf("a:%d\n",a);

    cout<<"hello"<<endl;

    system("pause");

    return ;
}
//类似指针的作用,引用也是可以间接赋值,其实可以这么理解
int &b=a;
int *b= a;//不能再用c语言的语法去思考c++

 

普通引用必须用其他的变量进行初始化


void myswap(int &a,int &b){
    int c=0;
    c =a ;
    a=b;
    b=c;
}
//相比c,引用的思想很方便。引用比指针要更简单些。
//一定情况下,引用可以替代指针发挥作用
//引用相对于指针来说具有更好的可读性

struct Teacher{
    char name[32];
    int age;
};
void  pT(Teacher *pt){
    cout<<pt->age<<endl;
}
void pT1(Teacher &pT1){
    cout<<pT1.age<<endl;
}
void pT2(Teacher pT){
    cout<<pT.age<<endl;
}
void main(){


    Teacher t1 ;
    t1.age = 35;

    pT(&t1);
    pT1(t1);//pt是t1的别名
    pT2(t1);//pT是形参,t1拷贝了一份数据给pT
    system("pause");

}

引用的本质
#include<iostream>
using namespace std;

void main(){
    const int c1 = 10;
    int z = 10;
    int &s= z;//b很像一个常量

    printf("&z:%d",&z);
        printf("&s:%d",&s);
//发现这两个地址一样

        system("pause");
        return ;
}
//引用其实就是同一个内存空间的门牌号


struct Teacher
{
        char name[64];
        int age;

        int &f;
        int &g;
};
void main()
{
    cout<<sizeof(Teacher)<<endl;
    system("pause");
}

//打印结果76,所以引用变量也分配了一个内存空间。

引用在c++内部实现是一个常量指针,因此引用所占用的空间大小与指针相同


//间接赋值条件
a)2个变量,一个形参,一个实参
b)实参取地址传递给形参,建立关联
c)改变形参指向,间接修改实参的值

void modify(int *p){
    int a =20;
    int *p = null;
    
    p = &a;
    *p = 100;

}

//当我们使用引用时,不需要考虑编译器怎样实现引用的
//但是debug和release运行不同情况可能出现不同的结果,这个时候就要考虑出现乱码的原因。


//函数当左值,返回变量的值

//引用当左值,返回的是变量的地址,当做引用时可以间接赋值,但是如果右值同样是一个局部变量地址,就会出现乱码。关键是看空间是有效空间,不能是局部内存空间。

//引用当右值,就不会再修改了,情况就会变得简单很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值