「C++系列」C++ 變量類型

文章目錄

  • 一、C++ 變量類型
    • 1. 基本數據類型
    • 2. 復合數據類型
    • 3. 類型修飾符
  • 二、C++ 變量定義
    • 案例 1: 基本類型變量的定義和初始化
    • 案例 2: 數組的定義和使用
    • 案例 3: 結構體(Struct)的定義和使用
    • 案例 4: 指針的定義和使用
    • 案例 5: 類的定義和使用(面向對象)
  • 三、C++ 變量聲明
    • 變量聲明與初始化
    • 案例 1: 局部變量和全局變量的聲明與定義
    • 案例 2: 使用`extern`關鍵字聲明變量
    • 案例 3: 使用`auto`和`const`
  • 四、C++ 左值和右值
    • 左值(Lvalue)
    • 右值(Rvalue)
    • C++11及之后的變化
    • 案例 1: 基本的左值和右值
    • 案例 2: 使用移動構造函數和移動賦值操作符
  • 五、相關鏈接

在這里插入圖片描述

一、C++ 變量類型

C++ 是一種靜態類型、編譯式、通用、面向對象的編程語言。在 C++ 中,變量是存儲信息的容器,并且每個變量都有特定的類型,這個類型決定了變量可以存儲什么類型的數據、需要多少存儲空間以及可以進行的操作。C++ 提供了多種基本數據類型和復合數據類型來支持不同的編程需求。

1. 基本數據類型

  1. 整型(Integer Types)
  • int:標準的整數類型,用于存儲整數值。
  • short:短整型,用于存儲較小的整數值。
  • long:長整型,用于存儲較大的整數值。
  • long long:更長的整型,用于存儲非常大的整數值。
  • unsigned:與上述類型結合使用,表示無符號類型,即只能存儲非負值。
  1. 浮點型(Floating-Point Types)
  • float:單精度浮點型,用于存儲有小數部分的數值。
  • double:雙精度浮點型,用于存儲更大范圍或更高精度的浮點數。
  • long double:擴展精度浮點型,提供比 double 更高的精度。
  1. 字符型(Character Types)
  • char:用于存儲單個字符(如字母或標點符號)。
  1. 布爾型(Boolean Type)
  • bool:表示真(true)或假(false)的布爾值。
  1. 枚舉類型(Enumeration Types)
  • enum:用戶定義的類型,包含一組命名的整型常量。
  1. 寬字符類型(Wide Character Types)
  • wchar_t:用于存儲寬字符(如 Unicode 字符)。

2. 復合數據類型

  1. 數組(Arrays)
  • 允許存儲相同類型數據的固定大小的集合。
  1. 結構體(Structures)
  • 允許將不同類型的數據項組合成一個單一的類型。
  1. 聯合體(Unions)
  • 允許在相同的內存位置存儲不同的數據類型,但一次只能使用其中一個。
  1. 類(Classes)
  • C++ 的核心特性之一,支持面向對象編程,包括封裝、繼承和多態。
  1. 指針(Pointers)
  • 存儲變量的內存地址,而不是變量的值。
  1. 引用(References)
  • 類似于指針,但提供了更高級別的抽象,并且是安全的(不能為空)。
  1. 字符串(Strings)
  • 在 C++ 中,字符串可以通過字符數組、std::string 類(C++ 標準庫中的一部分)等方式表示。

3. 類型修飾符

  • signedunsigned:用于指明整型變量是否有符號。
  • const:表示變量是常量,其值在初始化后不能被修改。
  • volatile:告訴編譯器該變量的值可能會在程序的控制之外被改變。

二、C++ 變量定義

在C++中,變量定義涉及到指定變量的類型以及變量的名稱,并可能包括初始化(即給變量賦一個初始值)。下面將展示幾個詳細的C++變量定義及使用的案例代碼。

案例 1: 基本類型變量的定義和初始化

#include <iostream>
using namespace std;int main() {// 定義并初始化整型變量int age = 30;// 定義并初始化浮點型變量float height = 5.9;// 定義并初始化字符型變量char gender = 'M';// 定義布爾型變量并初始化bool isStudent = true;// 輸出變量值cout << "Age: " << age << endl;cout << "Height: " << height << endl;cout << "Gender: " << gender << endl;cout << "Is Student: " << (isStudent ? "Yes" : "No") << endl;return 0;
}

案例 2: 數組的定義和使用

#include <iostream>
using namespace std;int main() {// 定義并初始化整型數組int numbers[] = {1, 2, 3, 4, 5};// 遍歷數組并打印每個元素for(int i = 0; i < 5; i++) {cout << "numbers[" << i << "]: " << numbers[i] << endl;}return 0;
}

案例 3: 結構體(Struct)的定義和使用

#include <iostream>
using namespace std;// 定義結構體
struct Person {string name;int age;float height;
};int main() {// 定義并初始化結構體變量Person person1 = {"John Doe", 30, 6.0};// 訪問結構體成員并打印cout << "Name: " << person1.name << endl;cout << "Age: " << person1.age << endl;cout << "Height: " << person1.height << endl;return 0;
}

案例 4: 指針的定義和使用

#include <iostream>
using namespace std;int main() {// 定義整型變量int value = 10;// 定義指向整型的指針變量,并初始化為指向valueint* ptr = &value;// 通過指針訪問變量的值cout << "Value through pointer: " << *ptr << endl;// 修改指針指向的值*ptr = 20;// 再次通過指針訪問變量的值,查看是否已修改cout << "Modified Value through pointer: " << *ptr << endl;return 0;
}

案例 5: 類的定義和使用(面向對象)

#include <iostream>
using namespace std;// 定義類
class Rectangle {
public:int width, height;// 構造函數Rectangle(int w, int h) : width(w), height(h) {}// 計算面積的方法int area() {return width * height;}
};int main() {// 創建Rectangle類的對象Rectangle rect(5, 7);// 調用對象的方法并打印結果cout << "Area of rectangle: " << rect.area() << endl;return 0;
}

三、C++ 變量聲明

在C++中,變量聲明(Declaration)和定義(Definition)有時可以互換使用,但在嚴格意義上它們是有區別的。聲明是告訴編譯器變量的類型和名稱,而定義(也稱為初始化)則是為變量分配內存空間并可能賦予一個初始值。然而,在大多數情況下,當你聲明一個變量時也會同時定義它(即給出初始值),或者在之后的某個點進行定義。

變量聲明與初始化

// 聲明一個整型變量,但不在此初始化(即僅聲明)
extern int a; // 這通常用于在多個文件中共享變量,但這里只是作為聲明的示例// 聲明并初始化一個整型變量
int b = 10; // 這既是聲明也是定義// 聲明一個整型變量,稍后在函數內部初始化
int c;
// ...
c = 20; // 現在c被定義了(如果之前沒有在其他地方定義)// 使用auto關鍵字自動推導類型(C++11及以后)
auto d = 3.14; // d的類型是double,因為3.14是double字面量// 聲明并初始化一個常量(使用const)
const int e = 5; // e是一個常量,其值在編譯時確定,且之后不能更改// 靜態局部變量聲明(在函數內部)
void func() {static int f = 0; // f在函數第一次調用時初始化,之后調用時保持其值f++;cout << "f: " << f << endl;
}

案例 1: 局部變量和全局變量的聲明與定義

#include <iostream>
using namespace std;// 全局變量聲明(通常也是定義)
int globalVar = 100;void func() {// 局部變量聲明并初始化int localVar = 20;cout << "Local variable: " << localVar << endl;// 訪問全局變量cout << "Global variable: " << globalVar << endl;
}int main() {func(); // 調用函數,展示局部變量和全局變量的使用// 嘗試在main中訪問localVar會導致編譯錯誤,因為它是func的局部變量return 0;
}

案例 2: 使用extern關鍵字聲明變量

當你想在多個源文件中共享變量時,可以使用extern關鍵字在一個或多個源文件中聲明變量,但在一個源文件中定義它。

#include <iostream>
using namespace std;// 定義全局變量
int sharedVar = 5;void printSharedVar() {cout << "sharedVar in file1.cpp: " << sharedVar << endl;
}// ...
#include <iostream>
using namespace std;// 聲明全局變量(不初始化)
extern int sharedVar;void modifySharedVar() {sharedVar = 10; // 修改在file1.cpp中定義的全局變量
}// ...

注意:在實際項目中,你還需要確保這些文件被正確地編譯和鏈接,以便extern聲明能夠找到變量的定義。

案例 3: 使用autoconst

#include <iostream>
#include <vector>
using namespace std;int main() {// 使用auto自動推導類型auto x = 10; // x的類型是intauto y = 3.14; // y的類型是double// 使用const聲明常量const int maxSize = 100; // maxSize是一個常量,其值在編譯時確定// 使用auto和const一起const auto z = 20.5; // z的類型是const doublecout << "x: " << x << endl;cout << "y: " << y << endl;cout << "maxSize: " << maxSize << endl;cout << "z: " << z << endl; // 注意:不能直接修改z的值,因為它是constreturn 0;
}

四、C++ 左值和右值

在C++中,左值(lvalue)和右值(rvalue)是表達式的一個關鍵屬性,它們與表達式的身份(location)和值(value)有關。左值通常指的是一個具有持久狀態的對象,其地址可取,可以被賦值。而右值則是一個臨時值,沒有持久的存儲位置,通常用于表達式的求值過程中,且不能作為左值被賦值。

左值(Lvalue)

  • 有持久的身份(即存儲位置)。
  • 可以出現在賦值語句的左側。
  • 可以取地址(& 操作符)。

右值(Rvalue)

  • 通常是臨時的,沒有持久的存儲位置。
  • 不能出現在賦值語句的左側(C++11之前)。
  • 不能直接取地址(盡管C++11引入了右值引用,允許通過std::move等方式“模擬”取地址)。

C++11及之后的變化

C++11引入了右值引用(通過&&表示)和移動語義,使得右值可以被更加高效地處理和利用。此外,還引入了std::move函數,用于將左值“轉換為”右值引用,以便可以使用移動構造函數或移動賦值操作符。

案例 1: 基本的左值和右值

#include <iostream>
#include <string>int main() {int a = 5; // a是左值int b = a; // 合法,因為a是左值int c = 10 + 20; // c是左值,但10 + 20這個表達式的結果是右值// int d = 10 + 20; // 這條語句在語法上也是合法的,但10+20的結果(右值)不會“存儲”在d中,而是被計算后賦值給d// 嘗試對右值進行取地址操作(編譯錯誤)// &(10 + 20); // 非法,因為右值沒有地址std::string s1 = "Hello"; // s1是左值std::string s2 = std::move(s1); // s1在這里被“轉換”為右值引用,以便s2可以“竊取”s1的資源// 注意:此時s1的狀態是未定義的,因為s2可能已經“接管”了s1的資源return 0;
}

案例 2: 使用移動構造函數和移動賦值操作符

為了展示移動語義,我們可以定義一個簡單的類,該類包含動態分配的內存,并實現移動構造函數和移動賦值操作符。

#include <iostream>
#include <cstring>
#include <algorithm>class MyString {
public:char* data;size_t len;// 構造函數MyString(const char* str) : len(std::strlen(str)) {data = new char[len + 1];std::strcpy(data, str);std::cout << "Constructor called" << std::endl;}// 移動構造函數MyString(MyString&& other) noexcept : data(other.data), len(other.len) {other.data = nullptr; // 防止析構時釋放已移動的資源other.len = 0;std::cout << "Move constructor called" << std::endl;}// 移動賦值操作符MyString& operator=(MyString&& other) noexcept {if (this != &other) {delete[] data; // 釋放當前對象的資源data = other.data;len = other.len;other.data = nullptr; // 防止析構時釋放已移動的資源other.len = 0;}std::cout << "Move assignment operator called" << std::endl;return *this;}// 析構函數~MyString() {delete[] data;std::cout << "Destructor called" << std::endl;}// 為了簡單起見,省略了拷貝構造函數和拷貝賦值操作符
};int main() {MyString s1("Hello");MyString s2 = std::move(s1); // 調用移動構造函數MyString s3("World");s3 = std::move(s2); // 調用移動賦值操作符// 此時s1和s2的資源已被s3接管,
}

五、相關鏈接

  1. Visual Studio Code下載地址
  2. Sublime Text下載地址
  3. 「C++系列」C++簡介、應用領域
  4. 「C++系列」C++ 基本語法
  5. 「C++系列」C++ 數據類型

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39638.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五、removeClosedPointCloud

五、removeClosedPointCloud 主要功能: removeClosedPointCloud 函數用于過濾掉點云中距離傳感器(例如激光雷達)太近的點。這些點可能會引入噪聲或不利于后續的點云處理和分析。函數通過比較每個點與傳感器之間的距離,移除那些距離小于設定閾值 minimumRange 的點。 計算…

網絡連接之隊頭阻塞!!!

一、什么是隊頭阻塞 隊頭阻塞&#xff0c;在網絡模型中簡單理解就是&#xff0c;對于隊列型的請求模型&#xff0c;如HTTP的請求-響應模型、TCP的ACK確認機制&#xff0c;都依賴得到一個具體的響應包&#xff0c;如果收不到這個響應包&#xff0c;那下一個請求就不能發&#x…

4、音視頻封裝格式---FLV

FLV FLV是一種容器封裝格式&#xff0c;是由Adobe公司發布和維護的&#xff0c;用于將視頻編碼流與音頻編碼流進行封裝。對于任意一種封裝格式&#xff0c;都有其頭部區域與數據區域&#xff0c;在FLV中&#xff0c;稱之為FLV Header與Body。 對于FLV Header&#xff0c;一個FL…

python自動移除excel文件密碼(升級v2版本)

歡迎查看第一版 https://blog.csdn.net/weixin_45631815/article/details/140013476?spm1001.2014.3001.5502 一功能改進 此版本主要改進功能有以下: 直接可以調用函數實現可以嘗試多個密碼沒有加密的文件進行保存,可以按實際業務進行改進.思路來源:java 面向對象設計模式.…

煤礦安全大模型:微調internlm2模型實現針對煤礦事故和煤礦安全知識的智能問答

煤礦安全大模型————礦途智護者 使用煤礦歷史事故案例,事故處理報告、安全規程規章制度、技術文檔、煤礦從業人員入職考試題庫等數據,微調internlm2模型實現針對煤礦事故和煤礦安全知識的智能問答。 本項目簡介: 近年來,國家對煤礦安全生產的重視程度不斷提升。為了確…

SpringBoot+mail 輕松實現各類郵件自動推送

一、簡介 在實際的項目開發過程中&#xff0c;經常需要用到郵件通知功能。例如&#xff0c;通過郵箱注冊&#xff0c;郵箱找回密碼&#xff0c;郵箱推送報表等等&#xff0c;實際的應用場景非常的多。 早期的時候&#xff0c;為了能實現郵件的自動發送功能&#xff0c;通常會…

前端期末1111

前端期末 超文本標記語言&#xff08;英語&#xff1a;HyperText Markup Language&#xff0c;簡稱&#xff1a;HTML&#xff09; body&#xff1a;在網頁文檔中&#xff0c;所有文本&#xff0c;圖像&#xff0c;音頻和視頻等代碼只能放在標簽內才能呈現給用戶。 HTML中的標…

【STM32入門教學】——串口、定時器與參考資料

機器人工程系列文章目錄 這里羅列了系列文章鏈接 概念總述 STM入門教學 還沒寫完組里急用 文章目錄 機器人工程系列文章目錄概念總述STM入門教學 前言串口串口的概念cubemxkeil5實物實驗關于cubemx生成邏輯printf升級usart.cmain.hretarget.c 定時器定時器的概念cubemxkeil5…

帶電池監控功能的恒流直流負載組

EAK的交流和直流工業電池負載組測試儀對于測試和驗證關鍵電力系統的能力至關重要&#xff0c;旨在實現最佳精度。作為一家客戶至上的公司&#xff0c;我們繼續盡我們所能應對供應鏈挑戰&#xff0c;以提供出色的交貨時間&#xff0c;大約是行業其他公司的一半。 交流負載組 我…

時鐘切換的代碼

目錄 描述 輸入描述&#xff1a; 輸出描述&#xff1a; 參考代碼 描述 題目描述&#xff1a; 存在兩個同步的倍頻時鐘clk0 clk1,已知clk0是clk1的二倍頻&#xff0c;現在要設計一個切換電路&#xff0c;sel選擇時候進行切換&#xff0c;要求沒有毛刺。 信號示意圖&…

學習springMVC

第四章 Spring MVC 第一節 Spring MVC 簡介 1. Spring MVC SpringMVC是一個Java 開源框架&#xff0c; 是Spring Framework生態中的一個獨立模塊&#xff0c;它基于 Spring 實現了Web MVC&#xff08;數據、業務與展現&#xff09;設計模式的請求驅動類型的輕量級Web框架&am…

車云匯的元宇宙之旅

在汽車行業持續迎來數字化和科技革新的今天&#xff0c;車云匯作為一個領先的汽車服務平臺&#xff0c;正通過探索元宇宙這一新興概念&#xff0c;將傳統服務與虛擬現實技術相結合&#xff0c;為車主提供全新的互動體驗和服務模式。這一創新不僅有望改變汽車行業的服務面貌&…

匿名內部類在Java編程中的應用與限制

匿名內部類在Java編程中的應用與限制 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 匿名內部類在Java編程中的應用與限制 1. 什么是匿名內部類&#xff1f;…

什么叫創世區塊、創世區塊有什么用、為什么需要創世區塊

創世區塊&#xff08;Genesis Block&#xff09;是任何區塊鏈技術中的第一個區塊&#xff0c;它是區塊鏈的起點&#xff0c;標志著該區塊鏈的誕生。在創世區塊之前沒有任何區塊存在&#xff0c;因此它沒有前一個區塊的哈希值&#xff0c;通常這個位置會被設置為零或者一個預定義…

vue3源碼(六)渲染原理-runtime-dom

1、從入口文件看實現 項目入口文件 import { createApp } from vue import ./style.css import App from ./App.vuecreateApp(App).mount(#app)文件位置core\packages\runtime-dom\src\index.ts 保證了render的唯一性 // // rendererOptions 是patchProp 和nodeOps的合集&a…

可視化低代碼平臺之:RayData光啟元的震撼作品。

RayData家的可視化作品&#xff0c;貝格前端工場是經常碰到&#xff0c;制作十分的精良&#xff0c;業內很有影響力。他們也有自己的低代碼平臺&#xff0c;分為了桌面版和網頁版&#xff0c;本期分享一下他們的作品。

徹底掌握 Git:從零基礎到高級實戰的全方位教程

文章目錄 一、Git 簡介二、安裝 Git1. Windows2. macOS3. Linux 三、Git 基本概念四、初次使用 Git1. 配置 Git2. 創建一個新的 Git 倉庫3. 克隆一個遠程倉庫4. 跟蹤文件5. 提交變更6. 查看歷史記錄 五、Git 分支管理1. 創建和切換分支2. 合并分支3. 分支沖突 六、遠程倉庫1. 添…

to_json 出現亂碼的解決方案

大家好,我是愛編程的喵喵。雙985碩士畢業,現擔任全棧工程師一職,熱衷于將數據思維應用到工作與生活中。從事機器學習以及相關的前后端開發工作。曾在阿里云、科大訊飛、CCF等比賽獲得多次Top名次。現為CSDN博客專家、人工智能領域優質創作者。喜歡通過博客創作的方式對所學的…

國產分布式數據庫災備高可用實現

最近在進行核心業務系統的切換演練測試&#xff0c;就在想一個最佳的分布式數據庫高可用部署方案是如何保證數據不丟、系統可用的&#xff0c;做到故障時候可切換、可回切&#xff0c;并且業務數據的一致性。本文簡要介紹了OceanBase數據庫和GoldenDB數據庫在災備高可用的部署方…

kafka的架構

一、架構圖 Broker&#xff1a;一臺 kafka 服務器就是一個 broker。一個kakfa集群由多個 broker 組成。一個 broker 可以容納多個 topic。 Producer&#xff1a;消息生產者&#xff0c;就是向 kafka broker 發消息的客戶端 Consumer&#xff1a;消息消費者&#xff0c;向 kafk…