欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Define,const,static用法總結

 更新時間:2013年10月08日 08:46:40   作者:  
const定義的全局數(shù)據(jù)變量,其基本作用和define相同,但又在define的基礎上增加了好多功能

1、Define用法:
define主要是用于宏常量定義的,使程序看起來更簡潔明了,方便代碼維護,#define定義的實質只是一個常數(shù)的名字,沒有具體數(shù)據(jù)類型的,沒有分配內存空間。在編譯是會被編譯器替換為該常數(shù)。每次使用該宏定義,就要進行編譯并分配空間,若一個程序中多次使用define定義的數(shù)據(jù),則就會有多份拷貝。這么做是為了提高程序的可讀性,但安全性相對差點。

2、const用法:
const定義的全局數(shù)據(jù)變量,其基本作用和define相同,但又在define的基礎上增加了好多功能。const定義的數(shù)據(jù)在程序開始前就在全局變量區(qū)分配了空間,在程序執(zhí)行的過程中,若用到該數(shù)據(jù),直接讀取就可以,沒必要每次進行編譯,整個程序過程中也只有一個拷貝。關于const用法好多,如:

(1)定義常量
const int a=100;  //定義a為一個全局數(shù)據(jù)區(qū)常量
const int *a=&i;   //定義一個指向常量i的指針,其中*a是不能修改的
int * const a=&i;  //定義一個常量指針 ,其中a是不能修改的 
const int * const a=&i; //定義一個指向常量i的常量型指針

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

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

當輸入普通數(shù)據(jù)類型時,不需要加const修飾,因為參數(shù)本身就是臨時分配到??臻g的拷貝,但若參數(shù)是用戶自定義類型或類時,需要引用傳遞,因為可以提高效率。

void fun(A a);    //A為用戶自己定義的類型,這種用法效率低,函數(shù)體內產生A類型的臨時對象復制參數(shù)a時,該臨時對象的構造、復制、析構過程都將消耗時間。

void fun(const A& a);  //這用用法效率高,引用傳遞不需要產生臨時對象,省了臨時對象的構造、復制、析構過程消耗的時間。但光用引用有可能改變a,所以                                             加const。

復制代碼 代碼如下:

#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時進行了兩次構造函數(shù)(student和person),再調用studentval(pa)函數(shù)時,需要創(chuàng)建pa的臨時變量,即調用了兩次拷貝構造函數(shù)(student和person),但該函數(shù)結束后,創(chuàng)建的臨時變量銷毀,調用了兩次析構函數(shù),而當main函數(shù)結束后,pa銷毀又調用了兩次構造函數(shù)。共調用了8次函數(shù)。若改為引用傳遞,及函數(shù)改為:
復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

#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類型的時候,按照多態(tài)應該顯示的student的內容,即顯示"hello stuent",但結果顯示的卻是"hello person",說明被切斷了,若改為bool studentval(const Person &p)時,便解決了該問題。

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

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

對于局部變量而言,static改變了變量的存儲方式,使其變?yōu)殪o態(tài)存儲,連接方式是內部連接(只能在該文件中使用,局部變量本來就是內部連接了),即局部變量只改變存儲方式,不改變連接方式。對于全局變量而言,則不改變存儲方式(全局變量已經(jīng)是靜態(tài)存儲了),它僅改變其連接類型,全局變量默認是外聯(lián)的,即能被其他外部文件直接使用,只需提前聲明extern,若加上static,則只能在本文件使用,即全局變量只改變連接方式,不改變存儲方式。

相關文章

  • C++?MiniZip實現(xiàn)目錄壓縮與解壓的示例詳解

    C++?MiniZip實現(xiàn)目錄壓縮與解壓的示例詳解

    Zlib是一個開源的數(shù)據(jù)壓縮庫,提供了一種通用的數(shù)據(jù)壓縮和解壓縮算法,本文主要為大家詳細介紹了如何利用Zlib實現(xiàn)目錄壓縮與解壓,需要的小伙伴可以參考下
    2023-11-11
  • C++程序檢測內存泄漏的方法分享

    C++程序檢測內存泄漏的方法分享

    這篇文章主要介紹了C++程序檢測內存泄漏的方法分享,本文講解了、對象計數(shù)、重載new和delete、Hook Windows系統(tǒng)API、使用DiagLeak檢測等內容,需要的朋友可以參考下
    2015-03-03
  • 使用Matlab繪制七夕咕呱小青蛙

    使用Matlab繪制七夕咕呱小青蛙

    七夕節(jié)到了還不快給你的朋友安排上這只咕呱小青蛙?本文將用Matlab繪制一個可愛的咕呱小青蛙,感興趣的小伙伴可以動手嘗試一下
    2022-08-08
  • C語言八大排序之堆排序

    C語言八大排序之堆排序

    堆排序是利用堆這種數(shù)據(jù)結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復雜度均為O(nlogn),它也是不穩(wěn)定排序
    2022-02-02
  • 詳解C語言結構體中的char數(shù)組如何賦值

    詳解C語言結構體中的char數(shù)組如何賦值

    這篇文章主要給大家介紹了關于C語言結構體中的char數(shù)組如何賦值的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • 關于C++內存中字節(jié)對齊問題的詳細介紹

    關于C++內存中字節(jié)對齊問題的詳細介紹

    本篇文章是對C++內存中字節(jié)對齊的問題進行了詳細的分析與總結。需要的朋友參考下
    2013-05-05
  • C++指向類成員函數(shù)的指針詳細解析

    C++指向類成員函數(shù)的指針詳細解析

    由于這幾天在開發(fā)中要用到函數(shù)指針,所以就整理了一下關于函數(shù)指針的概念
    2013-08-08
  • C++中的幾種排序算法

    C++中的幾種排序算法

    這篇文章主要介紹了C++中的幾種排序算法,需要的朋友可以參考下
    2014-02-02
  • c++重載運算符時返回值為類的對象或者返回對象的引用問題

    c++重載運算符時返回值為類的對象或者返回對象的引用問題

    這篇文章主要介紹了c++重載運算符時返回值為類的對象或者返回對象的引用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言楊氏矩陣實例教你編寫

    C語言楊氏矩陣實例教你編寫

    楊氏矩陣是一個數(shù)字矩陣,矩陣的每一行從左到右一次遞增,矩陣從上到下遞增,在這樣的矩陣中查找一個數(shù)字是否存在。時間復雜度小于O(N),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2023-02-02

最新評論