Define const static用法

來源:互聯網
上載者:User

1、Define用法:

  define主要是用於宏常量定義的,使程式看起來更簡潔明了,方便代碼維護,#define定義的實質只是一個常數的名字,沒有具體資料類型的,沒有分配記憶體空間。在編譯是會被編譯器替換為該常數。每次使用該宏定義,就要進行編譯並分配空間,若一個程式中多次使用define定義的資料,則就會有多份拷貝。這麼做是為了提高程式的可讀性,但安全性相對差點。

2、const用法:

  const定義的全域資料變數,其基本作用和define相同,但又在define的基礎上增加了好多功能。const定義的資料在程式開始前就在全域變數區分配了空間,在程式執行的過程中,若用到該資料,直接讀取就可以,沒必要每次進行編譯,整個程式過程中也只有一個拷貝。關於const用法好多,如:

(1)定義常量

  const int a=100;  //定義a為一個全域資料區常量
  const int *a=&i;   //定義一個指向常量i的指標,其中*a是不能修改的
  int * const a=&i;  //定義一個常量指標 ,其中a是不能修改的  
  const int * const a=&i; //定義一個指向常量i的常量型指標

(2)const修飾函數參數(包括傳值、傳址、引用)

  void fun(const int a);       //修飾傳值,但這個用法是沒有用的,因為a本身就是要傳入資料的一個拷貝,是另分配的記憶體,所以對a的改變,對原先資料是沒                                                                 有影響的
  void fun(const int *a);     //修飾傳址,要傳入的資料是一個地址,此時若程式中對*a進行修改,則原先的資料也會跟著修改,所以若不想改變原先資料                                                        的值,只是希望在函數中引用該資料,則需要加const
  void fun(const int &a);     //修飾引用,其效用和傳址是一樣的,引用就是給要傳入的資料起了一個別名。

關於修飾引用,下面重點說一下:

  當輸入普通資料類型時,不需要加const修飾,因為參數本身就是臨時分配到棧空間的拷貝,但若參數是使用者自訂類型或類時,需要引用傳遞,因為可以提高效率。
     void fun(A a);    //A為使用者自己定義的類型,這種用法效率低,函數體內產生A類型的臨時對象複製參數a時,該臨時對象的構造、複製、析構過程都將消                                耗時間。
  void fun(const A& a);  //這用用法效率高,引用傳遞不需要產生臨時對象,省了臨時對象的構造、複製、析構過程消耗的時間。但光用引用有可能改變a,所以                                             加const。

View Code

#include <iostream>
#include <string>
using namespace std;

class Person {
public:
Person()
{
cout<<"creat person"<<endl;
}
~Person()
{
cout<<"destroy person"<<endl;
}
virtual void fun() const
{
cout<<"hello person"<<endl;
}
};

class Student: public Person {
public:
Student()
{
cout<<"create student"<<endl;
}
~Student()
{
cout<<"desotry student"<<endl;
}
virtual void fun() const
{
cout<<"hello sudent"<<endl;
}
};

bool studentval(Student p)
{
p.fun();
return true;
}
int main(int argc,char *argv[])
{
Student pa;
cout<<endl;
studentval(pa);
cout<<endl;
return 0;
}

  分析:首先聲明Student pa時進行了兩次建構函式(student和person),再調用studentval(pa)函數時,需要建立pa的臨時變數,即調用了兩次拷貝建構函式(student和person),但該函數結束後,建立的臨時變數銷毀,調用了兩次解構函式,而當main函數結束後,pa銷毀又調用了兩次建構函式。共調用了8次函數。若改為引用傳遞,及函數改為:

View Code

bool studentval(const Student& p)
{
p.fun();
return true;
}

因為引用傳遞時沒有構造臨時變數,也就不需要另外進行構造和析構了,就整個函數過程只需要4次調用。

  另外const修飾引用還可以解決多態中的"切斷"問題,如下面代碼中多態的實現:

View Code

#include <iostream>
#include <string>
using namespace std;

class Person {
public:
Person()
{
cout<<"creat person"<<endl;
}
~Person()
{
cout<<"destroy person"<<endl;
}
virtual void fun() const
{
cout<<"hello person"<<endl;
}
};

class Student: public Person {
public:
Student()
{
cout<<"create student"<<endl;
}
~Student()
{
cout<<"desotry student"<<endl;
}
virtual void fun() const //勿丟const
{
cout<<"hello sudent"<<endl;
}
};

bool studentval(Person p)
{
p.fun();
return true;
}
int main(int argc,char *argv[])
{
Student pa;
cout<<endl;
studentval(pa);
cout<<endl;
return 0;
}

按理說調用studentval(Person p),當傳入Student類型的時候,按照多態應該顯示的student的內容,即顯示"hello stuent",但結果顯示的卻是"hello person",說明被切斷了,若改為bool studentval(const Person &p)時,便解決了該問題。

(3)const修飾成員函數
  void fun(int a) const
(4)const修飾函數傳回值
  const int *fun(int a)

3、static用法:

  函數內部定義的變數,在程式執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題: 如果想將函數中此變數的值儲存至下一次調用時,如何??最容易想到的方法是定義一個全域的變數,但定義為一個全域變數有許多缺點,最明顯的缺點是破壞了此變數的存取範圍(使得在此函數中定義的變數,不僅僅受此函數控制)。因此C++ 中引入了靜態變數static,用它來修飾變數,它能夠指示編譯器將此變數在程式的靜態儲存區配置空間儲存,這樣即實現了目的,又使得此變數的存取範圍不變。

  對於局部變數而言,static改變了變數的儲存方式,使其變為靜態儲存,串連方式是內部串連(只能在該檔案中使用,局部變數本來就是內部串連了),即局部變數只改變儲存方式,不改變串連方式。對於全域變數而言,則不改變儲存方式(全域變數已經是靜態儲存了),它僅改變其連線類型,全域變數預設是外聯的,即能被其他外部檔案直接使用,只需提前聲明extern,若加上static,則只能在本檔案使用,即全域變數只改變串連方式,不改變儲存方式。

 

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.