2017.11.11 複合類型

来源:http://www.cnblogs.com/wongsh/archive/2017/11/11/7819911.html
-Advertisement-
Play Games

2.3 複合類型 2.3.1 引用 引用就是為對象起了個別名,引用類型引用另外一種類型。通過將聲明符寫成&d的形式來定義引用類型,其中d是聲明的變數名。 int ival =1024; int &refVal= ival; // refVal 指向ival (是ival 的另一個名字) 2.3.2 ...


2.3 複合類型

2.3.1 引用

引用就是為對象起了個別名,引用類型引用另外一種類型。通過將聲明符寫成&d的形式來定義引用類型,其中d是聲明的變數名。

int ival =1024;

int &refVal= ival;          // refVal 指向ival (是ival 的另一個名字)

2.3.2 指針

指針是“指向”另外一種類型的複合類型。與引用不同,第一,指針本身就是一個對象,允許對指針賦值和拷貝,而且在指針生命周期內它可以先後指向幾個不同的對象。其二,指針無須在定義時賦值。在塊作用域內定義的指針如果沒有被初始化,也將擁有一個不確定的值。

定義指針類型的方法將聲明符寫成*d的形式,其中d是變數名。

獲取對象的地址

指針存放某個對象的地址,想要獲取該地址,需要使用取地址符&。

int ival= 42;

int *p = &ival;          // p存放變數ival的地址,或者說p是指向變數ival 的指針

 

指針值

指針的值應屬於下列4種狀態之一:

1.指向一個對象。

2.指向緊鄰對象所占空間的下一個位置。

3.空指針,意味著指針沒有指向任何對象。

4.無效指針,也就是上述情況之外的其他值。

 

利指針訪問對象

如果指針指向了一個對象,則允許使用解引用符(*)來訪問該對象;

int ival = 42;

int *p= &ival;               //p存放變數ival的地址

std::cout<<*p;            //由符號*得到指針p所指的對象,輸出42.

 

對指針的解引用會得出所指對象,因此如果給解引用的結果賦值,實際上也就是給指針所指的對象賦值;

*p=0;

cout<<*p;  //輸出0

 

空指針

空指針不指向任何對象,以下列出生成空指針的方法;

int *p = nullptr;

int *p = 0;

int *p = NULL;          //需要首先#include <cstdlib>

 

void*     指針

void* 是一種特殊的指針類型,可用於存放任意對象的地址。

double obj = 3.14 , *pd= &obj;

void *pv=&obj;

pv=pd;

利用void* 指針能做的事比較有限:拿他和別的指針比較、作為函數的輸入或輸出,或者賦給另一個void*指針。

 

指向指針的指針

**表示指向指針的指針,***表示指向指針的指針的指針。

int ival=1024;

int *pi=&ival;

int **ppi=&pi;

 

 

2.4 const 限定符

 

const 可以讓變數的值,保持不變。

 

const int bufsize = 512;

 

 

 

某些時候有這樣一種const變數,它的初始值不是一個常量表達式,但又確實有必要在文件之間共用。這種情況下,我們不希望編譯器為每個文件分別生成獨立的變數。相反,我們想讓這類const 對象像其他對象一樣工作,也就是說,只在一個文件中定義const,而在其他多個文件中聲明並使用它。

 

解決辦法是,對於const 變數不管是聲明還是定義都添加extern 關鍵字,這樣只需定義一次就可以了:

 

// file_1.cc 定義並初始化了一個常量,該常量能被其文件訪問

 

extern const int bufsize = fcn();

 

//file_1.h 頭文件

 

extern const int bufsize;

 

file_1.cc 定義並初始化bufsize。因為這條語句包含了初始值,所以它是一次定義。然而,因為bufsize 是一個常量,必須用extern 加以限定使其被其他文件使用。

 

file_1.h 頭文件中的聲明也由extern做了限定,其作用是指明bufsize 並非本文件獨有,它的定義將在別處出現。

 

 

 

用頂層const 表示指針本身是一個常量,而用名詞底層 const 表示指針所指的對象是一個常量。

 

int i = 0;

 

int *const p1 = &i;          // 不能改變p1的值,這是一個頂層的const

 

const int ci = 42;          //不能改變ci的值,這是一個頂層const

 

const int *p2 = &ci;           //允許改變p2的值,這是一個底層const

 

const int *const p3 = p2;      // 靠右的const 是頂層const,靠左的是底層const

 

const int &r = ci;               //用於聲明引用的const 都是底層const

 

 constexpr 變數          

 

允許將變數聲明為constexpr類型以便由編譯器來驗證變數的值是否是一個常量表達式。

 

constexpr  int mf = 20;

 

constexpr int limit = mf +1;

 

constexpr int sz = size();

 

 

 

2.5 處理類型

 

2.5.1 類型別名

 

typedef double wages;             //wages 是double 的同義詞

 

typedef wages base,*p;           //base是double的同義詞,p是double *的同義詞

 

新的聲明方法

 

using SI = Sale_item;              //SI是Sale_item 的同義詞

 

 

 

2.5.2  auto 類型說明符

 

auto 讓編譯器通過初始值來推算變數的類型。

 

 

 

2.5.3 decltype 類型指示符

 

有時會遇到這種情況:希望從表達式的類型推斷出要定義的變數的類型,但是不想用該表達式的值初始化變數。decltype 的作用是選擇並返回操作數的數據類型。

 

decltype(f()) sum = x;            // sum的類型就是函數f的返回類型

 

 

 

 

 

 

 

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 時間換算 時間換算 題目內容: UTC是世界協調時,BJT是北京時間,UTC時間相當於BJT減去8。現在,你的程式要讀入一個整數,表示BJT的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位 ...
  • 之前因為都在忙著畢業的開題答辯與投稿論文的事宜,一直沒有時間更新這個系列的文章。看了我上一篇霧中風景的文章,師弟希望我繼續把這個系列的文章寫下去。坦白說,C++的特性很多,這也不是教學指南的文章,我會選取一些自己在學習C++過程之中值得探討的問題和大家聊一聊,拋磚引玉。好的,今天先放點開胃菜,和大家 ...
  • 功能實現 需求:根據表單的欄位名,如果和參數的變數名一致,並且類型相容,那麼將數據自動封裝到對應的自動上。 包括的支持的數據類型有: 1.基礎數據類型:long、int、double、float、char、byte、boolean、short 2.基礎數據類型的包裝類:Long、Integer、Do ...
  • 最近要啟動微信項目,上個月就開始瞭解微信的開發,這個月要啟動項目,配置微信公眾號信息一直失敗。為此,我甚至手工寫了微信提交過來的記錄,如: &timestamp=1510210523&nonce=2414550015&signature=30b9eeb6b1134d0a53623375c48ca73 ...
  • CopyOnWriteArrayList併發容器 Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共用同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開始Java並 ...
  • 1》Socket相關: 1>Socket Families(地址簇): socket.AF_UNIX 本機進程間通信 socket.AF_INET IPV4 socket.AF_INET6 IPV6 2>Socket Types: socket.SOCK_STREAM #for tcp socket ...
  • 下麵是轉發博客內容,挺有用的 大家好哈,現在呢靜覓博客已經兩年多啦,可能大家過來更多看到的是爬蟲方面的博文,首先非常感謝大家的支持,希望我的博文對大家有幫助! 之前我寫了一些Python爬蟲方面的文章,Python爬蟲學習系列教程,涉及到了基礎和進階的一些內容,當時更多用到的是Urllib還有正則, ...
  • package com.swift; public class Maopao { //冒泡法 public static void main(String[] args) { int[] arr= {28,2,38,1,390,17,10,9,323}; for(int i=0;iarr[j+1])... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...