专题一之经典问题解析
来源:互联网 发布:中国银行金融软件 编辑:程序博客网 时间:2024/05/04 22:48
一.实例1:const与引用的问题
#include <stdio.h>#include <stdlib.h>int main(){const int x=1;int& rx=const_cast<int&>(x);//const_cast 去掉const属性rx = 5;printf("x=%d\n",x); // 1printf("rx=%d\n",rx); // 5printf("&x=%d\n",&x); /// 指向相同的地址 printf("&rx=%d\n\n\n",&rx);//////////////////////////////volatile const int y=2;//volatile 不做优化int *p=NULL; p=const_cast<int*>(&y);*p =6;printf("y=%d\n",y); //// 6printf("*p=%d\n\n\n",*p); /// 6 //////////////////////////////////const int z=y;p =const_cast<int*>(&z);*p=7;printf("z=%d\n",z); /// 7 printf("*p=%d\n\n\n",*p); /// 7///////////////////////////////////char c = 'c';char& rc=c;const int& trc=c;rc ='a';printf("c=%c\n",c); //aprintf("rc=%c\n",rc); //aprintf("trc=%c\n",trc); //c,成为只读变量 return 0; }
什么是符号表?如何才能进入到符号表,成为真正的常量
(1)符号表是编译器编译过程中产生的数据结构
(2)volatile修饰的const常量不会进入到符号表中
如:volatile const int y =2; //不会进入符号表中
const引用的类型与初始化变量的类型
相同:使初始化变量成为只读变量
不同:生成一个新的只读变量,其初始值与初始化变量相同。
二.实例2:指针与引用
#include <stdio.h>#include <stdlib.h>struct SV{int x;int y;int z;};struct SR{int& x;int& y;int& z;};int main(){SV sv={1,2,3};SR sr={sv.x,sv.y,sv.z};printf("&sv =%p\n",&sv);printf("&sv.x=%p\n",&sv.x);printf("&sv.y=%p\n",&sv.y);printf("&sv.z=%p\n\n\n",&sv.z);printf("&sr =%p\n",&sr);printf("&sr.x=%p\n",&sr.x);printf("&sr.y=%p\n",&sr.y);printf("&sr.z=^%p\n\n\n",&sr.z);SV& rsv=sv;rsv.x =4;rsv.y =5;rsv.z =6;printf("rsv=%d\n",sv.x);printf("rsv=%d\n",sv.y);printf("rsv=%d\n",sv.z);return 0; }
指针与引用的区别:
*指针式变量,其值是一个内存地址。
* 引用只是一个变量的新名字。
* 引用必须初始化,之后无法引用其他值。
* 理解引用的本质是指针常量
三. 案例3:重载
程序1:
#include <stdio.h>#include <stdlib.h>void func(int a,int b){printf("void func(int a,int b)\n");}void func(char a,int b){printf("void func(char a,int b)\n");}void func(int a,char b){printf("void func(int a,char b)\n");}void func(char a,char b){printf("void func(char a,char b)\n");}int main(){int a=1;char b='2';func(a,a);func(a,b);func(b,a);func(b,b);printf("\n\n\n");func(1,2);func(1,'2');func('1',2);func('1','2');return 0; }
程序2:
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;int main(){printf("sizeof(\'1\')=%d\n",sizeof('1'));// 1printf("sizeof(2)=%d\n",sizeof(2)); // 4printf("sizeof(3.0)=%d\n\n\n",sizeof(3.0)); // 8char c='1';short s='1';int i='1';floatlong l='1';long long ll='1';c = 2;// c是char s = 2; // si = 2;l = 2;ll = 2;cout<<c<<endl;cout<<s<<endl;cout<<i<<endl;cout<<l<<endl;cout<<ll<<endl<<endl;float f = 0;double d = 0;f = 3.0;d = 3.0;cout<<f<<endl;cout<<d<<endl;return 0; }
说明:C++编译器对字面量的处理方式
当使用字面量对变量进行初始化或赋值时
* 无溢出产生:编译器对字面量进行默认类型转换
* 产生溢出:编译器会做出截断操作,并产生警告。
理解重载规则:
(1) 精确匹配实参;
(2) 通过默认类型转换匹配市实参
(3)通过默认参数匹配实参
四. C方式编译
实例:
#include <stdio.h>#include <stdlib.h>extern "C"{void func(int x){const int i = 1;int& ri =const_cast<int&>(i);ri = 5;printf("i=%d\n",i);printf("ri=%d\n",ri);}}void func(const char* s){printf("%s\n",s);}int func(int a,int b){return a+b;}int main(){return 0; }
说明:
(1)extern“C”告诉C++编译器将其中的代码进行C方式编译
C方式编译的主要按照C语言的规则对函数名进行编译
(3)C编译器不会在编译后的函数名中加入参数信息
注意:(可以从他们的汇编代码中看出,)
extern“C”中的重载函数经过C方式编译后将得到相同的函数名,因此extern“C”中不
允许函数重载,但是extern“C”里面的函数可以与它之外的函数进行重载
- 专题一之经典问题解析
- 五、专题一经典问题解析
- 5、专题一经典问题解析
- c++学习笔记(5.专题一经典问题解析)
- c++学习笔记(10.专题二经典问题解析)
- c++学习笔记(13.专题三经典问题解析)
- c++学习笔记(17.专题四经典问题解析)
- ~新概念专题学习~之 词汇/词组使用解析一
- C++经典问题解析之二
- 经典问题解析三
- C++经典问题解析
- J2EE专题之经典书籍篇
- Velocity-专题一之基本概念
- Java算法之经典问题篇(一)
- 经典问题解析(二)
- Android AsyncTask经典问题解析
- 经典问题解析(4)
- 67-经典问题解析五
- hdu 4336 Card Collector 概率dp+状态压缩
- 【LeetCode】Single Number
- Distinct Subsequences+uva+经典dp
- Scene视图的快捷操作
- POJ1201 Intervals(查分约束系统)
- 专题一之经典问题解析
- Foundation--NSKeyedArchiver与NSKeyedUnarchiver
- Linux下C与Mysql的混合编程
- 游戏服务器设计的一些感悟
- 非常有用的 Markdown 编辑器和工具
- C++单例
- 容易混淆的四个php函数strstr strrchr substr stristr
- LeetCode: Construct Binary Tree from Inorder and Postorder Traversal
- HTTP Content-type 与 AFNetworking--Mark过来备用