1、作用域:
C只有一个全局作用域,相同的变量名将会发生,但是C++可以通过namespace{},来划分全局作用域,在不同的作用域相同的变量名是不会冲突的。如图:
#include <iostream>
namespace A{
int a=10;
}
namespace B{
int a=20;
namespace C{//namespace允许嵌入
int a=30;
}
}
int main(void)
{
std::cout<<"A a="<<A::a<<std::endl;
std::cout<<"B a="<<B::a<<std::endl;
std::cout<<"C a="<<B::C::a<<std::endl;
return 0;
}
2、三目运算符的不同
C语言的目运算符返回的是变量的值,但是c++可以返回变量本身。
c++代码如下:
#include <iostream>
int main(void)
{
int a=10,int b=20;
((a>b)?a:b)=50;//50赋值给了b
std::cout<<" a= "<<a<<" b="<<b<<std::endl;
}
接下来看C语言的
出现了编译错误。
顺便来看一下函数的返回是啥样的,第一种是返回常规类型
发现出现的是左值错误。再来看返回类的函数
#include <iostream>
class TEST
{
public:
int a;
TEST(int b=0){
this->a=b;
}
};
TEST test1(int c)
{
TEST d=c;
return d;
}
int main(void)
{
TEST a=10,e;
e=(test1(5)=20);
std::cout<<"e="<<e.a<<std::endl;
return 0;
}
这个就真的妥妥可以运行,说明了返回值为类的类型的函数,返回的是一个变量,而不是一个值。
3、const修饰符
const int a; //1
int const b; //2
const int *c; //3
int * const d; //4
const int * const e ; //5
第一个第二个修饰的是整形常量,
第三个是指向常整形数的指针,但是它指向的地址可以变经常用到函数参数中例如 :
void kkkk(const int *aa);
第四个:内存里面的值可以改变,但是它所指向内存地址不能改变
第五个:一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
int main(void)
{
int const a = 10;
int*const d = (int *)&a;
int*const e = (int *)&a;
*d = 30;
*e = 40 printf("d=%d a=%d e=%d &d=%x a=%x e=%x\n", *d,a,*e,d,&a,e);
}
const小结
1、const修饰的变量也是有地址的,
2、上面的例子指针d指向了a的地址,虽然执行*d=30,但是,a的值没有变化,说明a的值不是在内存取出来的,它们存在了符号表中,是从符号表中取出来的,不管地址的事。
(注:但是在C语言中a是变化的。)
哈哈,C语言中const修饰常量是假的常量。
4、引用,c++多了这个机制
int main(void)
{
int a = 0;
int &b = a; //引用定义的同时必须进行初始化
printf("a=%x b=%x\n", &a, &b);
}
打印出它们的地址,它们的地址都是一样的,其实a就是b,引用就是地址的赋值,将右边的地址赋值给左边。
引用也可以指向指针,例如:
int main(void)
{
int c = 10;
int *a = &c;
int *&b =a;
printf("a=%x b=%x\n", a, b);
}
2、当函数返回值为引用的时候。
int& kkk1(void)
{
int c=1;
printf("局部变量地址%x\n",&c);
return c;
int main(void)
{
int &a=kkk1();
printf("\na的值=%d\n",a);
int &b=kkk1();
printf("\na的值=%d,b的值=%d\n",a,b);
b=20;
printf("\na的值=%d,b的值=%d\n",a,b);
int &c=kkk1();
printf("\na=%d,b=%d,c=%d\n",a,b,c);
}
从上来可以看书,虽然地址是返回来了,但是都是这个地址都是栈里面的地址,很容易被覆盖。
下面试着将其定义成静态变量。
int& kkk1(void)
{
static int c=1;
printf("静态变量地址%x\n",&c);
return c;
}
int main(void)
{
int &a=kkk1();
printf("\na的值=%d\n",a);
int &b=kkk1();
printf("\na的值=%d,b的值=%d\n",a,b);
b=20;
printf("\na的值=%d,b的值=%d\n",a,b);
int &c=kkk1();
printf("\na=%d,b=%d,c=%d\n",a,b,c);
}
如果是静态变量的话,那就是没问题的了。
引用int&a就是相当于int *a;