1. 程式人生 > >c和c++的區別之const

c和c++的區別之const

1.const

C++:

在c++中,const定義的是常量,該常量的值是不可以被修改的,編譯時期
該使用該常量的地方直接替換成該常量的值,當然,常量是必須初始化的。
因為編譯時期,使用該常量的地方必須替換成該常量的值,若沒有初始化,
則此常量就是無用的常量

const修飾的資料產生的符號是local的,因為在編譯時期就會替換常量的值,
此過程只在本檔案中進行,外檔案是無法解析此檔案的常量



C語言:

在c語言中const定義的是常變數

下面用程式碼演示一下C和C++在const的區別:

#include<stdio.h>

int main1()
{
	const int a = 10;

	int *p = &a;
	*p = 20;
	
	printf("*p = %d   a = %d\n", *p, a);  //20  20

	return 0;
}

這是在c語言裡面定義的常變數,其結果 *p = 20,a = 20;

#include<iostream>
using namespace std;

int main()
{
	const int a = 10;
	int *p = (int *)&a;
	*p = 20;
	cout << *p << "    " << a << endl;  //20         10
        
        return 0;
}

這是在C++裡面定義的常量,其結果*p = 20;a = 10;在編譯時期用到a常量的時候直接替換成10,所以不管如何改變*p的值都不會影響a的值

在編譯時期不能確定常量值的時候c++中的常量就會退化成常變數

int c = 20;
const int d = c;//退化成常變數
int *p2 = (int *)&d;
    *p2 = 30;
    cout << *p2 << "    " << d <<"  "<<c <<endl;  //30 30  20
因為c是變數,所以d的值是無法確定的,所以d退化成了常變數

void fun(const int a) //退化成常變數
{
	int *p = (int *)&a;
	*p = 30;
	cout << *p << "  " << a << endl;  // 30 30
}

const作為形參也會退化成常變數

int main()
{
        fun(10); 
        return 0;
}

const的基本用法:

const修飾的是離它最近的完整型別
const修飾的內容是它修飾型別的內容
const修飾的內容不容許修改
不允許洩漏常量的地址給非常量的指標
int main()
{
        
	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 * -> int *            //ok          
	q1 = p2;    const int * -> int *      //error  洩漏常量的地址給非常量
	q1 = p3;    int * const -> int *      //ok

	
	q2 = p1;    int * -> const int *            //ok
	q2 = p2;    const int * -> const int *      //ok
	q2 = p3;    int * const -> const int *      //ok

        q3 = p1;      //error,
        q3 = p2;      //error
        q3 = p3;      //error, p3被const直接修飾,則它的值不允許被修改

	return 0;
}

這些基本上就是c和c++關於const區別的用法,望與君共勉……