C++引用说明

来源:互联网 发布:sql语句执行顺序 inner 编辑:程序博客网 时间:2024/06/04 00:18

三目运算符在C++中返回的是变量而不是值,在C语言中返回的是值不是变量,在C++中是通过返回地址再取值达到的返回变量本身

#include <iostream>using namespace std;int main(){    int a = 20;    int b = 30;    (a < b ? a : b) = 10; //C++中三目运算符返回的是变量本身    //让表达式返回一个内存空间,,,,也就是内存的首地址  指针 //其实在C++中相当于做了一下的处理      * (a < b ? &a : &b) = 50;      //其实就是相当于让表达式返回变量的地址,而不是变量的本身这样就能够使用变量的地址改变变量的值 这一部分相当于C++编译器帮助程序员完成的第一部分  因为当左值必须有内存空间    printf("The result of b :%d\n",b);    printf("The result of a is %d\n",a);    printf("hello world!\n");    system("pause");          return 0;}
#include <iostream>using namespace std;int main(){    const int *c;   //const修饰的是指针指向的内存空间不能被修改    int * const d;   //const修饰的指针不能够被更改,指针是确定的不能够更改,但是指针指向的数值是可以被更改的    const int * const c;    printf("hello world!\n");    system("pause");          return 0;}

C语言中的const 是一个冒牌货,因为同样的代码在C语言中能够通过指针修改cosnt的值但是在C++中却不可以

//在C语言中能够通过指着修改a的值,运行结果A的值是20int main(){    //好像a是一个常量    const int a = 330;    int *p = NULL;    p = (int *) &a;    *p =  20;    printf("a = %d\n",a);    printf("*p = %d\n",*p);    printf("hello world!\n");      return 0;}

同样的代码在C++中运行的结果A的值依然是330

#include <iostream>using namespace std;int main(){    //好像a是一个常量    const int a = 330;    int *p = NULL;    p = (int *) &a;   //会从新开辟一段内存,并且这段内存由p指向,但是a还是a,只是按照a的大小和形式开辟内存    *p =  20;    printf("a = %d\n",a);    printf("*p = %d\n",*p);   //输出的是20 *p和a不是一个内存    printf("hello world!\n");    system("pause");          return 0;}

C++语言中的const才是真正的const常量
C++中将const声明的变量回放在一个符号表中,符号表中是使用键值对的即(keey : value)的形式,并且键值一旦确定个就不能更改。
const内存的分配时机是在编译器编译的时候进行内存的分配的
并且在C++中声明为const的变量必须在声明的时候进行初始化
下面写一段例子进行证明:

所使用的C++工程如下所示:

#include <iostream>using namespace std;int main(){    //证明const变量是在编译的时候进行的内存的分配    int a;    const  int  b = 10;    int c;    printf("&a = %x,&b =  %x,&c = %x\n",&a,&b,&c);    system("pause");          return 0;}

输出的结果证明b的地址在a和c的之间,这就证明了const声明的变量的内存是在编译的时候进行内存的分配的;

在C++中const的用途,其实const常用来在C++中替换#define
在C++中能够使用const声明的变量作为数组得到下标,这是因为const声明的变量也是在编译阶段进行的处理
const由编译器处理提供类型检查和作用域检查

使用#define的时候就算是在局部函数中进行的宏定义作用域也是整个源文件下面的例子编译是通过的

#include <iostream>using namespace std;int main02(){    //证明const变量是在编译的时候进行的内存的分配    int a;    const  int  b = 10;    int c;    printf("&a = %x,&b =  %x,&c = %x\n",&a,&b,&c);    system("pause");          return 0;}void func1(){#define a 10    const int b = 20;//#undef a }void func2(){    printf("a = %d\n",a);}int main(){    func1() ;    func2();    system("pause");          return 0;}

当打开#undef a 的时候编译就不能够通过,#undef就是取消对#define的宏定义可以指出定义得到内容也可以不指出 不指出的时候就是取消前面定义的任何的东西

#include <iostream>using namespace std;int main02(){    //证明const变量是在编译的时候进行的内存的分配    int a;    const  int  b = 10;    int c;    printf("&a = %x,&b =  %x,&c = %x\n",&a,&b,&c);    system("pause");          return 0;}void func1(){#define a 10    const int b = 20;#undef a  //这样能保证只有在该函数中才能够使用宏定义的a}void func2(){    printf("a = %d\n",a);}int main(){    func1() ;    func2();    system("pause");          return 0;}

但是使用const在局部函数中声明的变量 就不能够在其他函数中进行调用

#include <iostream>using namespace std;int main02(){    //证明const变量是在编译的时候进行的内存的分配    int a;    const  int  b = 10;    int c;    printf("&a = %x,&b =  %x,&c = %x\n",&a,&b,&c);    system("pause");          return 0;}void func1(){#define a 10    const int b = 20;//#undef a }void func2(){    printf("a = %d\n",a);    printf("b = %d",b);}int main(){    func1() ;    func2();    system("pause");          return 0;}
1>------ 已启动生成: 项目: 项目练习, 配置: Debug Win32 ------1>正在编译...1>demo8_const.cpp1>e:\vs2008\项目练习\项目练习\demo8_const.cpp(28) : error C2065: “b”: 未声明的标识符1>生成日志保存在“file://e:\VS2008\项目练习\项目练习\Debug\BuildLog.htm”1>项目练习 - 1 个错误,0 个警告========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

在C++中引用就相当于变量的别名,直接可以用来更改原始数据

#include <iostream>using namespace std;//复杂数据类型的引用struct Teacher{    char name[64];    int age;};void printfT(Teacher &pT){    cout <<  pT.age  << endl;}void printfT2(Teacher &pT)      //引用相当于别名直接可恶意更改变量原来的数值{    pT.age  = 26;    cout << pT.age << endl;}int main(){        Teacher t1;    t1.age = 35;    printfT(t1);    printfT2(t1);    system("pause");          return 0;}
#include <iostream>//C语言中的宏定义//使用宏定义对字符串进行处理using namespace std;int main(){     int x = 20;    const int &y = x;   // 常引用   让变量引用拥有只读属性   不能通过y修改x了    {        int &m = 20;   //编译不通过,因为 字面量没有内存          // 引用就是给变量起一个别名,但是字面量没有别名     //const 变量的类型  C++编译器会将const 类型数据分配内存        const int &m = 10; //可以使用  因为C++会给m分配一个内存空间   让 m 指向这个内存空间    }    system("pause");          return 0;}
原创粉丝点击