第二课C与c++的异同

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;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值