1. 程式人生 > >const和define的差別

const和define的差別

問題 高程 編譯器 參數 fine 返回值 安全檢查 clu 類型安全

1、const有什麽用途?
(1)可以定義const常量
(2)const可以修飾函數的參數和返回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防以外的變動,能提高程序的健壯性。

int main()
{
    const int j=42;
    const int k;//錯誤,未初始化
    extern const int j=100;//const對象被設定為僅在文件內有效,要在文件外使用,需要利用extern
    j+=1;//錯誤,j不能改變

    int i=2;
    int &r1=i;
    const int &r2=i;
    r1
=0; r2=1;//錯誤,r2是一個常量引用 cout<<i<< <<r1<< <<r2<<endl;//0 0 0,r1、r2綁定i,但是r2不能改變i的值。 return 0; }

2、const和define有什麽差別?
C++可以用const定義常量,也可以用#define定義常量,但前者比後者有更多的優點:
(1)const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對後者只進行字符替換,沒有類型安全檢查,並且在字符替換中可能會產生意料不到的錯誤(邊際效應)。


(2)有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。在C++程序中只使用const常量而不是用宏常量,即const常量完全取代宏常量。

宏定義:

#include <iostream>
#include <cstdio>

#define SQR_1(x) (x*x);
#define SQR_2(x) ((x)*(x))

using namespace std;
int main()
{
    int a,b,c,d;
    b=d=3;
    a=SQR_1(b+2);
    cout<<a<<endl;
    c
=SQR_2(d+2); cout<<c<<endl; return 0; }

宏定義展開時容易造成二義性問題。a=SQR_1(b+2)展開後為b+2*b+2=11,c=SQR(d+2)展開後為(d+2)*(d+2)=25

const和define的差別