C++引用/列舉/typedef/標頭檔案/預編譯器/自定義標頭檔案
引用是別名
int &refVal2;//引用型別定義必須初始化
int &refVal3 = 10;//引用初始化必須是物件
當初始化後,只要改引用存在,他就保持繫結到初始化時指向的物件。不可能將引用繫結到另一個物件。
要理解重要概念是引用只是物件的另一個名字。
初始化是指明引用指向哪個物件的唯一方法。
定義多個引用
可以在一個型別定義行中定義多個引用。必須在每個引用識別符號前新增”&”符號。
const引用 //————需要仔細研讀
指向const物件的引用。
const int ival = 1024;
const int &refVal = iVal;
int &ref2 = ival// error: const引用指向const物件。
const引用可以初始化不同型別物件或者初始化為右值。
const 引用可以初始化為不同型別的物件或者初始化為右值,如字面值常量。
int i = 42;
const int &r = 42;
const int &r2 = r + i;
同樣的初始化對於非const引用卻是不合法的,而且會導致編譯時錯誤。其原因非常微妙,值得解釋一下。
引用繫結到不同的型別時所發生的事情,最容易理解為上述行為。假如我們編寫。
double dval = 3.14
const int &ref = dval;
編譯器會把這些程式碼轉換為以下形式編碼:
int temp = dval ;
const int &ri = temp;
如果 ri不是const ,那麼可以給ri賦一個新值。這樣做不會修改dval,而修改了temp。期望對ri的賦值會修改dval的程式設計師會發現dval並沒有向被修改。
僅允許const引用繫結到需要臨時使用的值完全避免了這個問題,因為const是隻讀的。
typedef 可以用來定義型別的同義詞
typedef double wages;
typedef int exam_score;
typedef wages salary;
typedef 通常被用於三點目的:
為了隱藏特定型別的實現,強調使用型別目的
簡化複雜的型別定義,使其更易理解
允許一種型別用於多個目的,同時使得每次使用該型別的目的明確。
列舉
我們經常需要為某些屬性定義一組可選擇的值。例如,檔案開啟的狀態可能會有三種:輸入、輸出和追加。
定義和初始化列舉:列舉的定義包括關鍵字,其後是一個可選的列舉型別名,和一個用花括號括起來、用逗號分開的列舉成員。
預設的,第一個列舉成員賦值為0,後面的每個列舉成員賦值的值比前面的大1.
列舉成員是常量
class關鍵字與struct關鍵字的區別。
class關鍵字來定義類,第一個訪問標號前的任何成員都隱式指定為private,
struct關鍵字定義類,第一個標號前的任何成員都隱式指定為public。使用class或者是struct定義類,僅僅影響預設的初始訪問級別。
標頭檔案
標頭檔案一般包括類的定義,extern,變數的宣告和函式的宣告。
標頭檔案的正確使用能夠帶來兩個好處:保證所有檔案使用給定實體的統一宣告;當生命需要修改時,只有標頭檔案需要更新。
設計標頭檔案還學要主意以下幾點:標頭檔案中所能做的宣告在邏輯上應該是適於放在一起的。
編譯標頭檔案需要一定的時間。如果標頭檔案太大,程式設計師可能不太願意承受包含該標頭檔案所帶來的編譯時代價。
標頭檔案用於生命而不是用於定義
語句的定義不應該放在標頭檔案裡。
應為標頭檔案包含在多個原始檔裡,所以不應該含有變數或函式的定義。
對於標頭檔案不應該含有定義這一規則,有三個例外。標頭檔案可以定義類、之在編譯時就已知的const物件和inline函式。
在標頭檔案中定義這些實體,是因為編譯器需要它們的定義來產生程式碼。
例如:為了產生能定義或使用類的物件的程式碼,編譯器需要知道組成該型別的資料成員。同樣還需要知道能夠在這些物件上執行的操作。類定義提供所需要的資訊。
一些const物件定義在標頭檔案中
一般來說,常量表達式是 編譯器在編譯時就能計算出結果的表示式。當const整形變數通過常量表達式自我初始化時,這個const整型變數就可能是常量表達式。
而const變數和他的初始化式必須是每個檔案都可見的。要使初始化式可見,一般都把這樣的const變數定義在標頭檔案中。
那樣的話,無論const變數何時使用,編譯器都能夠看見其初始化形式。
const變數放入標頭檔案有一個很重要的含義:當我們在標頭檔案定義了一個const變數之後,每個包含該標頭檔案的原始檔都有了自己的const變數,其名稱和值都一樣。
當const變數是用於常量表達式初始化時,可以保證所有的變數都有相同的值。但實踐中,大部分的編譯器在編譯時都會用相應的常量表達式來替換對那些const常量的使用。
所以,在實踐中不會有任何儲存空間用於儲存用常量表達式初始化的const常量
如果const變數不是用常量表達式初始化,那麼他就不應該在標頭檔案中定義。相反,和其他的變數一樣const變數應該在一個原始檔中定義並初始化。
應在標頭檔案中為它新增extern宣告以使其能被多個檔案共享。
前處理器的簡單介紹
設計標頭檔案時,應使其可以多次包含在同一原始檔中,這一點很重要。我們必須保證多次包含同一標頭檔案不會引起該標頭檔案定義的類和物件被多次定義。
使得標頭檔案安全通過的通用做法,是使用前處理器定義標頭檔案保護符。
避免多重包含。
編譯標頭檔案之前,我們需要引入一些額外的前處理器設施。前處理器允許我們自定義變數。
前處理器的名字在程式中必須是唯一的。任何與前處理器變數相匹配的的名字的使用都關聯到該前處理器變數
前處理器有兩種狀態:已定義或未定義。
定義前處理器變數和檢測其狀態所用的前處理器指示不同.
標頭檔案保護符
ifdef SALESTIEM_H
#define SALESTIEM_H
#endif
define 指示接受 一個名字並定義改名字為前處理器變數。 #ifndef指示檢測指定的前處理器變數是否未定義。如果前處理器未定義,那麼跟在其後的所有指示都被處理,直到出現#endif
使用自定義的標頭檔案
如果標頭檔案名包括在尖括號裡(<>),那麼認為該標頭檔案是標準檔案。編譯器會在預定義位置集查詢該標頭檔案,
這些預定義位置可以通過設定查詢路徑環境變數或者通過命令列選項來修改,使用的查詢方法因編譯器的不同而迥異。
如果標頭檔案括在一對引號裡,那麼認為他是非系統標頭檔案,非系統標頭檔案的查詢通常開始於原始檔所在的路徑。
相關推薦
C++引用/列舉/typedef/標頭檔案/預編譯器/自定義標頭檔案
引用是別名 int &refVal2;//引用型別定義必須初始化 int &refVal3 = 10;//引用初始化必須是物件 當初始化後,只要改引用存在,他就保持繫結到初始化時指向的物件。不可能將引用繫結到另一個物件。 要理解重要概念是
Spring-boot中讀取核心配置檔案application和自定義properties配置檔案的方式
前言:瞭解過spring-Boot這個技術的,應該知道Spring-Boot的核心配置檔案application.properties,當然也可以通過註解自定義配置檔案**.properties的資
標頭檔案中的巨集定義 標頭檔案中的巨集定義
標頭檔案中的巨集定義 程式碼: 1 #ifndef DSP_ADC_BSP_H_ //防止標頭檔案被重複包含 2 #define DSP_ADC_BSP_H_ 3 4 #ifdef _DSP_
Cocos2d-x 專案新建自定義類後編譯錯誤:打不開自定義標頭檔案錯誤解決方案
現在Cocos2dx新建工程需要執行Python指令碼來建立,不再提供Cocos2dx模板。一般我們使用VS2010編譯完Cocos2dx後,可以開始使用Cocos2dx目錄下\tools\project-creator\create_project.py來建立工程。 命
C#API解決自定義請求頭下的跨域問題
contains sha allow oba webapi with cat ride bapi 解決方法一: public class CrosHandler : DelegatingHandler { private const str
C# RichTextBox檔案拖拽自定義以及相關屬性介紹
c# RichTextBox是.net中一個非常不錯的控制元件,它支援格式化文字,圖片,表格,載入第三方控制元件的功能,但是很多時候它並不能滿足我們的需求,所以我們需要對它的功能進行調整或重寫 RichTextBox拖拽功能背景介紹 預設情況下RichTextBox的屬性面
C#-XML檔案提取字串+字串存為XML檔案+建立XML(自定義節點)檔案+讀取節點內容
一、將字串寫入xml檔案(並儲存) 寫入: XmlDocument xdoc = new XmlDocument(); xdoc.LoadXml(“xmlstring”); 儲存: xdoc.Save(“pathsave.xml”) 二、將
fatal error LNK1169: 找到一個或多個多重定義的符號或多個.c/.cpp檔案想同時呼叫定義在.h檔案裡面的全域性變數,防止重定義變數問題。
為什麼.h檔案中不能定義全域性變數? 原因: 存在多次建立變數.如果標頭檔案中可以定義全域性變數,那麼每個包含該標頭檔案的檔案裡都會有該全域性變數的定義.因為C語言的include是直接將檔案嵌入到include這個地方的. 解決辦法: 在標頭檔案使用 extern 來宣告該全域性變
cors跨域之簡單請求與預檢請求(傳送自定義請求頭)
引子 前後端分離這個問題,對cors的應用不斷增多,暴露出的問題也接踵而至。 正所謂慮一千次,不如去做一次。 猶豫一萬次,不如
php curl如何設置自定義請求頭和打印請求頭信息
設置 發出 cnblogs lose 請求 clas false 自定義 col $header = [ ‘client:h5‘, ‘token:test‘, ]; curlRequest($url, $params, true, 10, $header
[轉][Java]自定義標簽簡介
是否 沒有 override include file sch lang oca uri 作用:自定義標簽主要用於移除 jsp 頁面中的 java 代碼。 實現:需要完成以下兩個步驟: 編寫一個實現 Tag 接口的 Java 類,把頁面 java 代碼移到這個 java
jsp2自定義標簽開篇
oos .org emp context pub j2e sp2 hand ges 在JSP2中開發標簽庫需要以下幾個步驟: 1.開發自定義標簽處理類; 2.建立一個*.tld文件,每個*.tld文件對應一個標簽庫,每個標簽庫可包含多個標簽; 3.在JSP文件中使用自定義標
Qt自定義標簽按鈕
cpp -c mit idg 方便 class als ren 中心 當你接觸到Qt時,你會為它極為方便的跨平臺方面感到吃驚,從而想嘗試著使用Qt。漸漸地你會發現Qt自帶的一些控件不能滿足自己的需要,此時就需要我們自己定義一個屬於自己的控件。總所周知,標簽的風格設置類比較多
轉:C#制作ORM映射學習筆記一 自定義Attribute類
技術 sage 其中 username pac ont 學習 collect reat 之前在做unity項目時發現只能用odbc連接數據庫,感覺非常的麻煩,因為之前做web開發的時候用慣了ORM映射,所以我想在unity中也用一下ORM(雖然我知道出於性能的考慮這樣做事不
jsp自定義標簽
ref otherwise array type while entryset 利用 inf something 概念 自定義標簽是用戶定義的JSP語言元素。當JSP頁面包含一個自定義標簽時將被轉化為servlet,標簽轉化為對被 稱為tag handler的對象的操作,
Django的自定義標簽
html 函數 本質 自定義 tags 裝飾器。 使用 重復 imp Django提供了自定義標簽功能,可以方便常用方法的重復使用。
怎樣使用自定義標簽簡化 js、css 引入?
display ans ria 機制 end utf-8 之間 red ffffff 國慶將至,工作興致全無,來總結點項目裏平時不起眼幹貨。 前端引入 js 、css 一般是這樣: <script type="text/javascript" sr
自定義標簽
跳過 *** hello public tld 得到 屬性 客戶 執行 一、創建自定義標簽基本步驟 1、步驟 標簽處理類(標簽也是一個對象,那麽就需要先有類!) tld文件,它是一個xml 頁面中使用<%@taglib%>來指定tld文件的位置 2、標簽處理類
django 的模板語言template ,自定義過濾器,自定義標簽,模板繼承
test block src view -- back def 其他 init 後端views文件傳來的字符串和對象,到前端頁面後需要進行渲染, {{ 變量 }}{{ 變量| filter:參數 }}filter可以有很多函數 {#對後端傳來的數據進行渲染,add 就是過濾
jsp自定義標簽處理轉義字符
char location xmlns exception Coding port exceptio bre tostring sun公司提供的jstl雖然比較強大,但是開發中很難滿足我們所有的需求,並且開發也禁止在jsp中寫很多java代碼,因此很多場景需要自己定義標簽進