c和c++的区别(二)

const

c语言中const修饰的量为常变量,可以通过一定的方法修改其值,如下代码:

# include<stdio.h>

int main()
{
	const int i = 20;
	int *p = &i;
	*p = 30;
	printf("%d\n", i);

	return 0;
}

c++中const修饰的量为常量,值不允许改变(改变不了)。在编译期的时候将使用该常量值的地方替换成该常量的值。如下代码

# include<iostream>
using namespace std;

int main()
{
	const int i = 10;
	int *p = (int *)&i;
	*p = 20;

	cout << *p << "   " << i << endl;//在编译时将此处i替换成10
	//输出为20  10
	return 0;
}
  • c++中常量必须初始化
  • const修饰的数据产生的符号时local类型的符号,因为其产生一个global类型的符号也没用,常量是在编译期的时候进行值的替换,编译是单文件的,所以其产生一个global类型的符号,别的文件中也没法引用它进行替换。

c++常量可以退化成常变量(编译期无法确定其值的时候会退化),如下操作

int c = 20;
const int s = c;
此时s就退化成一个常变量,因为在编译的时候常量进行替换,此时无法得知该用什么值进行替换s,在编译期间不
进行取值的过程。

void fun(const int a)
{
    int *p = (int *)&a;
    *p = 30;

    cout << *p <<"  " <<a;//此时常量啊,也退化成了一个常变量因为在编译时无法确认其值
}

int main()
{
    const int d = 10;
    int *p = (int *)&d;

    fun(10);
}
  • const修饰的类型是离它最近的完整类型
  • const修饰的内容是它修饰类型的内容
  • const修饰的内容不允许被改变
  • 不允许泄漏常量的地址给非常量的指针
int b = 10;

int *p1 = &b;//正确
const int *p2 = &b;//正确
int *const p3 = &b;//正确

int *q1 = *b;
const int *q2 = &b;
int *const q3 = &b;

q1 = p1; //int *p1 ---> int *q1 正确
q1 = p2; //const int *p2 ---> int *q1  错误,(*p2)为常量,q1为非常量的指针
q1 = p3; //int *const p3 ---> int *q1  正确,常量为p3,没有泄漏p3的地址

q2 = p1; //int *p1 ---> const int *q2  正确,没有常量泄漏地址
q2 = p2; //const int *p2 ---> const int *q2 正确,p2 q2均为常量的指针
q2 = p3; //int *const p3 ---> const int *p2 常量为p3,没有泄漏p3的地址

引用(c++特有)

引用是变量的一个别名,引用底层是一个指针,在使用的时候替换成了指针的解引用

  • 引用必须初始化
  • 不允许泄漏常量的引用给一个非常量的引用
  • 引用一个临时量,如下:
int fun()
{
    return 1;
}
int main()

{
    const int &p = fun();//引用一个不可寻址的常量,产生一个临时量(常量)供引用
    return 0;
}



const int &p = 10;//也是产生一个临时量(常量)供引用

注意:

  1. 标准类型产生的临时量是常量
  2. 自定义类型产生的临时量是非常量
  • 引用单独使用不参与类型
  • const单独使用不参与类型
  • const和引用结合使用参与类型
  • const修饰指针,如果修饰的内容里没有*,则const不参与类型

c语言代码如c++代码如何互相调用

c++调用c语言代码:

extern "C"  //用c语言的规则编译
{
    调用的代码
}

c语言调用c++代码:

在cpp文件中将c语言要调用的代码,用c语言的规则编译即可

猜你喜欢

转载自blog.csdn.net/qq_41727218/article/details/84111505