1、先说register吧
在c++中:
(1)register 关键字无法在全局中定义变量,否则会被提示为不正确的存储类。
(2)register 关键字在局部作用域中声明时,可以用 & 操作符取地址,一旦使用了取地址操作符,被定义的变量会强制存放在内存中。
在c中:
(1)register 关键字可以在全局中定义变量,当对其变量使用 & 操作符时,只是警告“有坏的存储类”。
(2)register 关键字可以在局部作用域中声明,但这样就无法对其使用 & 操作符。否则编译不通过。
2、constc语言可以通过下面方式修改const
const int a = 10;
int *p = &a;
*p = 11;
但是C++不行,据说c++是再声明const的时候会在电脑某个区域创建一个键值对,之后就只许读,不许写,去过你非要写成上面的形式,编译器也不会报错,为了兼容,编译器会为a开辟一个内存然后付给p,这时候你随便修改这块内存,但是当你读a的时候他是不会来这里取数据的,而是直接取走键值对中的数据,所以说C++的常量更严格
3、三目运算
首先先看一个例子(a < b ? a : b )= 30;
他在c语言中是无法编译通过的,但是再c++中可以编译通过,为什么呢?因为在语言中(a < b ? a : b )返回的是一个常量,但是再c++中他返回的却是a或b的地址,这是因为c++做了改进,编译器遇到此句话时候会自动转为*(a < b ? &a : &b ),但c语言不会这样做,可以在c语言中*(a < b ? &a : &b )=30这样写试一下,发现可以编译通过,也可以在C++中这样写(a < b ? 4 : b )= 30;发现会编译不通过,这就证明了前面的推断是正确的
4、&引用
c++中的引用相当于创建了一个常量指针变量
int a = 10;
int &b = a;
b = 11;
相当于int * const b = a;那么问题来了,既然b是指针为什么用的时候没有*呢,这是因为,c++编译器会自动为我们处理,这句话听着好熟悉啊,对,你做不到的推给编译器就行,呵呵
对于引用做返回值的问题
#include "stdafx.h"
#include "iostream"
using namespace std;
int myf1()
{
int a ;
a = 10;
return a;
}
int& myf2()
{
int a ;
a = 11;
printf("a:%d", a);
return a;
}
int* myf3()
{
int a ;
a = 12;
return &a;
}
int _tmain(int argc, _TCHAR* argv[])
{
int b1 = myf1(); //ok
int b2 = myf2(); //返回了一个值,返回赋给b2
int &b3 = myf2(); //b3 返回值的引用
int &d = b2;
printf("b1:%d\n", b1);
printf("b2:%d\n", b2);
printf("b3:%d\n", b3); //b3是一个引用类型 c++编译器会帮我们执行 *p
printf("b3:%d\n", d); //d也会做*p,但是d所指向的内存空间没有被释放掉,所以不是乱码
system("pause");
return 0;
}
int& j()
{
static int a ; // 静态的不会被析构,所以不会乱码
a = 10;
printf("a:%d", a);
return a;
}
int main02()
{
int b1 = j(); //ok
int b2 = j(); //返回了一个值,返回赋给b2
int &b3 = j(); //b3 返回值的引用
printf("b1:%d\n", b1);
printf("b2:%d\n", b2);
printf("b3:%d\n", b3); //b3是一个引用类型 c++编译器会帮我们执行 *p
system("pause");
return 0;
}
引用的好处是引用当左值,如下
//static int a = 10; 把a变成一个状态变量
//a初始化的时候10 ,只初始化一次
//a = 11
int& mygg()
{
static int a = 10;
printf("a:%d", a);
return a;
}
int main03()
{
mygg() = 11;
mygg();
system("pause");
return 0;
}
int& myA(int &a)
{
a++;
return a;
}
void main77()
{
int b = 10;
int b1 = myA(b); //ok
int b2 = myA(b); //返回了一个值,返回赋给b2
int &b3 = myA(b); //b3 返回值的引用
printf("b1:%d\n", b1); //11
printf("b2:%d\n", b2);//12
printf("b3:%d\n", b3); //13
system("pause");
}