C++: 類 Class 的基礎用法

🏷? 標簽:C++、面向對象、類、構造函數、成員函數、封裝、繼承、多態
📅 更新時間:2025年6月15日
💬 歡迎在評論區留言交流你的理解與疑問!

文章目錄

  • 前言
  • 一、什么是類?
  • 二、類的定義
    • 1.基本語法
    • 2.示例
      • 1.學生類
      • 2.詳解構造函數
      • 3.實例化對象
  • 三、訪問權限 public / private / protected
    • 1.各類權限含義
    • 2.示例
  • 四、構造函數
    • 1.類型
    • 2.示例
  • 五、析構函數
    • 1.語法
    • 2.示例:
  • 六、類的友元
    • 1.什么是友元
    • 2.示例
    • 3.友元函數
      • 1.語法
      • 2.示例
  • 總結


前言

C++ 入門老是繞不過類與對象構造函數是什么成員函數怎么寫訪問權限有啥用
今天我們就來學習一下c++中的類


一、什么是類?

在 C++ 中,(Class)是一種用戶自定義的數據類型用于將數據和行為封裝在一起

類是模板,對象是實例

就像學生是一種類型,而“張三”“李四”是一個個對象

二、類的定義

1.基本語法

class 類名 {//訪問權限!!!!!!!!
private/public/protected:   // 構造函數// 成員函數private/public/protected:// 成員變量};

2.示例

1.學生類

我們創建一個表示學生的類

#include <iostream>
using namespace std;class Student {public://構造函數Student(string n, int a) {name = n;age = a;}//成員函數void introduce() {cout << "我是 " << name << ",今年 " << age << " 歲。" << endl;}//私有變量
private:string name;int age;};

2.詳解構造函數

構造函數是一個特殊的成員函數當對象被創建時自動調用常用于初始化成員變量
要求:
名稱必須與類名相同
沒有返回值

Student(string n, int a) {name = n;age = a;
}

同樣初始化我們可以通過初始化列表的方式進行初始化

Student(string n, int a):name(n),age(a) {// 構造函數體可留空,推薦用初始化列表初始化成員變量
}

我們還能用this指針來初始化
在成員函數中,this 是一個指向當前對象本身的指針

Student(string n, int a) {this->name = n;this->age = a;
}

3.實例化對象

我們可以在主函數中創建一個實例對象,然后調用其中的成員函數

int main()
{Student s1("小明",20);s1.introduce();return 0;
}輸出:
我是 小明,今年 20 歲。

三、訪問權限 public / private / protected

1.各類權限含義

public:公有成員,可以被所有代碼訪問。
private:私有成員,僅能被類的成員函數和友元訪問。
protected:受保護成員,僅能被類的成員函數、友元和派生類訪問。
在這里插入圖片描述默認是 private,推薦顯式寫出訪問權限,增強可讀性

2.示例

我們還是拿前面的學生類來舉例,我們在構造函數中對于成員變量成員函數我們都用public,這樣我們就能在類外訪問到了

正確示范:

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;}void introduce() {cout << "我是 " << name << ",今年 " << age << " 歲。" << endl;}public:string name;int age;};
int main()
{Student s1("小明",20);s1.introduce();cout<<"年齡:"<<s1.age<<endl;cout<<"名字:"<<s1.name<<endl;return 0;
}
輸出:
我是 小明,今年 20 歲。
年齡:20
名字:小明

錯誤示范:

private://改為私有string name;int age;

此時會報錯

a.cpp:27:24: error:int Student::age’ is private within this context27 |    cout<<"年齡:"<<s1.age<<endl;|                        ^~~
a.cpp:20:13: note: declared private here20 |         int age;|             ^~~
a.cpp:28:24: error: ‘std::string Student::name’ is private within this context28 |    cout<<"名字:"<<s1.name<<endl;|                        ^~~~
a.cpp:19:16: note: declared private here19 |         string name;|                ^~~~

因為類外不可以訪問!

四、構造函數

1.類型

默認構造函數:沒有參數的構造函數。
參數化構造函數:接受參數以初始化對象。
拷貝構造函數:用一個對象初始化另一個對象。
移動構造函數(C++11):從臨時對象“移動”資源

2.示例

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;cout<<"參數化構造函數"<<endl;}Student(){name="小明";age=10;cout<<"默認構造函數"<<endl;}Student(const Student &other){name=other.name;age=other.age;cout<<"拷貝構造函數"<<endl;}Student(Student&& other){name=other.name;age=other.age;cout<<"移動構造函數"<<endl;}private:string name;int age;};
int main()
{Student s1;Student s2("小明",20);Student s3=s2;Student s4=move(s3);return 0;
}

輸出:

默認構造函數
參數化構造函數
拷貝構造函數
移動構造函數

五、析構函數

析構函數(Destructor):在對象生命周期結束時調用,用于釋放資源

1.語法

~ 類名 ()
{
}

2.示例:

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;p=new int(age);//手動開辟 在堆上}~Student(){delete p;//手動開辟必須手動釋放}private:string name;int age;int* p;};

六、類的友元

1.什么是友元

友元(Friend):可以訪問類的私有保護成員的非成員函數或另一個類

2.示例

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;}~Student(){}private:string name;int age;friend class teacher;//關鍵聲明!!!!!!!!!!!!void play(){cout<<"hi"<<endl;}
};class teacher
{public:teacher(string name,int age){this->name=name;this->age=age;}~teacher(){}void f( Student& a){a.play();//直接訪問私有成員函數}private:string name;int age;
};int main()
{teacher s1("小明",20);Student s2("小明",20);s1.f(s2);return 0;
}輸出:hi

如果沒有聲明

friend class teacher;

那么在teacher的成員函數中這樣直接訪問是錯誤的

void f(Student& a){a.play();//直接訪問私有成員函數}

3.友元函數

友元函數: 單個函數可以被聲明為友元

這樣我們可以在函數內訪問私有變量

1.語法

friend 函數()
{}

然后函數如果要在類外實現的話
不需要
void 類:: 函數名(){}
因為友元函數并不是類的成員函數

2.示例

#include<iostream>
using namespace std;class Student 
{public:Student(string n, int a) {name = n;age = a;}~Student(){}friend void play(Student& a) ;//聲明友元函數private:string name;int age;
};void play(Student& a)//類外實現友元函數
{cout<<a.name<<endl;//調用私有變量
}int main()
{Student s2("小明",20);play(s2);return 0;
}
輸出:小明

總結

類(Class)是 C++ 中封裝數據和行為的基本單位,是面向對象編程的核心概念。

對象是類的實例,通過構造函數進行初始化,支持默認構造、參數構造、拷貝構造和移動構造。

訪問權限決定了類成員的訪問范圍:public(公有)、private(私有)、protected(保護),良好的封裝性是面向對象設計的重要原則。

構造函數負責初始化對象,析構函數負責資源釋放,兩者構成對象生命周期管理的基礎。

友元(函數或類) 是類提供的一種特殊機制,允許非成員函數或其他類訪問私有和保護成員

友元函數不是類的成員函數,定義時不需要加類名作用域限定符

如果你覺得本文對你有幫助,不妨點贊 + 收藏 + 關注,更多 C++ 系列教程將持續更新 🔥!

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

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

相關文章

Java EE與Jakarta EE命名空間區別

在 Java 生態中&#xff0c;javax 和 jakarta 代表了 企業級 Java 規范&#xff08;Java EE/Jakarta EE&#xff09;的命名空間演進&#xff0c;核心區別在于歸屬權和管理組織的變更。以下是詳細對比&#xff1a; 1. 歷史背景 javax&#xff1a; 源自 Java EE&#xff08;Java …

2 Studying《Arm A715 Technical Reference Manual》

目錄 2. The Cortex?A715 core 2.1 Cortex?A715 core features 2.2 Cortex?A715 core confifiguration options 2.3 DSU-110 dependent features 2.4 Supported standards and specifications 2.6 Design tasks 3. Technical overview 3.1 Core components 3.2 Int…

使用Nodejs嘗試小程序后端服務編寫:簡單的待辦事項管理demo

文章目錄 結構demo步驟demo運行效果API測試(1) 添加待辦事項(2) 獲取所有待辦事項(3) 切換完成狀態(4) 刪除待辦事項 API測試-RESTClient一些其他的高級功能環境變量管理不同環境配置授權認證 測試需要登錄的接口保存響應測試腳本編寫自動化測試 bug解決 結構 嘗試寫一個簡單的…

CSS“多列布局”

多列布局是一種非常常見的布局方式&#xff0c;適用于內容豐富的頁面&#xff0c;如新聞網站、雜志或博客。 一、CSS多列布局概述 CSS多列布局允許我們將內容分成多個垂直列&#xff0c;使頁面布局更加靈活和多樣化。多列布局的主要屬性包括 ??column-count??、??col…

Pump上狙擊機制的功能優勢和實戰教學

加密世界的發展永遠伴隨著速度的革命。無論是新的 Token 上線&#xff0c;還是熱點項目的第一波流動性注入&#xff0c;搶先一步往往意味著利潤的幾何級增長。在這個講究「秒殺」與「先機」的賽道中&#xff0c;一項關鍵策略正悄然成為鏈上操作者的常規武器——狙擊&#xff08…

條件收斂的級數中項必須趨于 0,正負項抵消,但趨于 0 的速度不需要“足夠快”

條件收斂的級數中&#xff0c;項必須趨于 0&#xff0c;但趨于 0 的速度不需要“足夠快”的原因可以從以下幾個方面理解&#xff1a; 1. 收斂的必要條件&#xff1a;項趨于 0 對于任何收斂的級數&#xff08;無論是絕對收斂還是條件收斂&#xff09;&#xff0c;都必須滿足 li…

Tomcat 和 Spring MVC

Tomcat 和 Spring MVC 是 Java Web 開發中兩大核心組件&#xff0c;分別承擔不同的角色&#xff1a; 一、Tomcat 定義 Apache Tomcat 是一個開源的 Servlet 容器&#xff08;也稱為 Servlet 引擎&#xff09;&#xff0b; JSP 引擎&#xff0c;實現了 Java EE&#xff08;現稱 …

【微服務】134:SpringCloud

今天是劉小愛自學Java的第134天。 感謝你的觀看&#xff0c;謝謝你。 image 學習內容安排如下&#xff1a; SpringCloud的接觸。利用SpringCloud搭建微服務架構&#xff0c;當然這個估計要3天時間才能完成&#xff0c;今天主要是注冊中心Eureka的學習。 一、SpringCloud 微服務…

三次貝塞爾曲線,二次貝塞爾曲線有什么區別

三次貝塞爾曲線和二次貝塞爾曲線在控制點數量、數學表達式和曲線復雜度上有所不同。以下是它們的主要區別&#xff1a; 1. 控制點數量 二次貝塞爾曲線&#xff1a;由3 個點定義&#xff08;起點、終點和 1 個控制點&#xff09;。三次貝塞爾曲線&#xff1a;由4 個點定義&…

springboot集成dubbo

BeanDefinitionRegistryPostProcessor public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {/*** 允許開發者在Spring容器加載Bean定義(BeanDefinition)后&#xff0c;實例化Bean之前&#xff0c;動態修改或注冊新的BeanDefinition* 該接…

Seata 全面深入學習指南

Seata 全面深入學習指南 學習目錄 第一部分:Seata 基礎篇 分布式事務基礎概念Seata 概述與核心架構Seata 部署與快速入門第二部分:Seata 核心機制 Seata 事務模式詳解 AT 模式TCC 模式SAGA 模式XA 模式Seata 事務協調機制Seata 高可用設計第三部分:Seata 高級特性 Seata 配…

【Linux】基于策略模式的簡單日志設計

&#x1f4dd;前言&#xff1a; 這篇文章我們來講講Linux——基于策略模式的簡單日志設計 &#x1f3ac;個人簡介&#xff1a;努力學習ing &#x1f4cb;個人專欄&#xff1a;Linux &#x1f380;CSDN主頁 愚潤求學 &#x1f304;其他專欄&#xff1a;C學習筆記&#xff0c;C語…

C#引用傳遞代碼記錄

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 值傳遞和引用傳遞 {internal class Program{static void Main(string[] args){person P1new person();P1.name "張三";person P2 …

React動態渲染:如何用map循環渲染一個列表(List)

React動態渲染&#xff1a;如何用map循環渲染一個列表(List)&#xff1f; 系列回顧&#xff1a; 在上一篇中&#xff0c;我們學習了如何通過onClick等事件處理&#xff0c;讓React應用響應用戶的操作。現在我們的組件已經能“聽懂話”了。但是&#xff0c;目前為止我們展示的內…

React Native【實戰范例】水平滾動分類 FlatList

import React from "react"; import { FlatList, SafeAreaView, StyleSheet, Text, View } from "react-native"; interface itemType {id: string;title: string;icon: string; } // 水平滾動數據 const horizontalData: itemType[] [{ id: "1"…

iOS swiftUI的實用舉例

SwiftUI 是 Apple 推出的聲明式 UI 框架&#xff0c;以下是一些實用技巧和最佳實踐&#xff0c;可以幫助你更高效地開發 iOS/macOS/watchOS/tvOS 應用。 1. 布局技巧 靈活的空間占用 // 使用 Spacer 填充可用空間 HStack {Text("Left")Spacer() // 填充中間空間 …

SpringMVC異步處理Servlet

使用SpringMVC異步處理Servlet解決的問題 可以不阻塞有限的tomcat 線程&#xff08;默認是200~250個&#xff0c;springboot3是200個&#xff09;&#xff0c;確保網絡請求可以持續響應特定業務使用自定義線程池&#xff0c;可以處理的業務量更大對上層業務完全無感知&#xf…

同步與異步編程范式全景研究——從CPU時鐘周期到云原生架構的范式演進

第一章 時空觀的根本分歧 1.1 物理時間的約束性 同步操作的本質是對牛頓絕對時間的服從&#xff0c;其阻塞特性源于馮諾依曼體系下指令順序執行的基因。現代CPU的流水線技術&#xff08;如Intel Hyper-Threading&#xff09;通過指令級并行實現偽異步&#xff0c;但開發者仍需…

【零散技術】5分鐘完成Odoo18 登陸頁面全自定義

序言:時間是我們最寶貴的財富,珍惜手上的每個時分 從最初的tinyERP到Open ERP&#xff0c;再由OpenERP到Odoo&#xff0c;雖然UI已經過了多次大改&#xff0c;Odoo登錄界面依舊丑陋&#xff0c;同時還有各種Odoo版權信息&#xff0c;對于定制項目而言是不友好的。 今天以Odoo18…

Vue3 + TypeScript + Element Plus + el-pagination 分頁查詢實例分享

前端技術棧&#xff1a;Vue3 TypeScript Element Plus el-pagination 后端技術棧&#xff1a;Java Spring Boot Mybatis 應用異常情況說明&#xff1a;點擊頁碼2&#xff0c;會發送兩次請求&#xff0c;并且自動跳回頁碼1 代碼&#xff1a; Reagent.vue <script set…