歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++ 聲明和初始化辨析

在進行C++培訓時,發現有些概念對於初次接觸c++的同事可能有點難於理解,所以這裡做些總結,一方面方便同事閱讀,另一方面也是對自己技能的一個總結。

一、聲明(declaration):用於向程序表明變量的類型和名字,是用來將一個object、function、class或template的類型和名字告訴編譯器。由2部分組成:類型 + 標示符,標示符可以包含字符*、[ ]和(),表明這個名稱是類型的指針、數組或者返回類型的函數。


聲明並不帶有細節信息;
定義也是一種聲明;
extern關鍵字可用來聲明變量而不定義,只是說明變量定義在程序的其他地方;
變量可以聲明多次,但只能定義一次
例子:
char *pc; // 類型是pc,標示符是*pc,表明*pc是一個char。


extern float x;  // 對象聲明


int func(double num); //函數聲明


class Person; //類聲明


template<class T>
class SmartPointer; //模板聲明


解讀復雜聲明的一種方法,遵循“聲明模仿使用”的原則逐步分解聲明。
例如:char * (*pfpc)();
* (*pfpc)(); // 是一個char
(*pfpc)();    // 是一個指向char的指針
(*pfpc);      // 是一個返回char類型指針的函數
pfpc;          // 是一個指向返回char類型指針的函數的指針


二、定義(definition):是用來將細節信息提供給編譯器。
對於object而言,定義是編譯器為它分配內存空間;
對於function或funciton template而言,定義是提供函數體;
對於class或class template而言,定義是列出該class或template的所有成員;
例子:
float x; //對象定義


//函數定義
int func(double num) {                 
    int t = static_cast<int>(num);
    return t;
}


//類定義
class Person {
public:
    Person();
    ~Person();


    String getName() const;
    void setName(String name);


  ....
};


//模板定義
template<class T>
class SmartPointer {
public:
    SmartPointer(T *p = 0);
    ~SmartPointer();
  T * operator->() const;
  T& operator*() const;
  ...
};

 


備注:如果聲明中有初始化,那麼它其實是定義。

    例如: externdouble pi = 0;

    此時pi是定義,所以如果這樣用的話會出錯:

    extern double pi = 0;

    extern double pi = 1; // 2個extern且初始化

Copyright © Linux教程網 All Rights Reserved