cpp學習筆記1--class

2年前學過cpp,但是一直沒有用到,現在要讀研了,終于要用到了,重新拿出來看一看,覺得很多東西都能在c和python上看到影子。

#include "iostream"
class Person {
private:std::string name;int age;public:// 默認構造函數Person() : name("Unknown"), age(0) { std::cout << "init 1" << std::endl; }// 帶參數的構造函數Person(const std::string& n, int a) : name(n), age(a) { std::cout << "init 2" << std::endl; }// 拷貝構造函數Person(const Person& other) : name(other.name), age(other.age) { std::cout << "init 3" << std::endl; }// 析構函數~Person() {std::cout << name << "對象被銷毀" << std::endl;}void introduce() {std::cout << "我叫" << name << ",今年" << age << "歲。" << std::endl;}void change(std::string new_name,int new_age) {name = new_name;age=new_age;std::cout << "changing is over" << std::endl;}
};

我來逐行解析一下。

首先私有變量是只有此類的此實例對象的公開區域的函數能調用的(后面還會有其他區域也能調用),也就是Person p1;Person p2;p2的pubilc函數不能調用p1的age,但是可以調用自己的,外部程序也無法直接訪問age

Person p1;
Person p2;
p1.introduce();
p2.introduce();
p2.change("Trump", 72);//p2可以改變自己的age
p2.introduce();
p2.age=10;//錯誤用法

然后public的第一個構造函數。它相當于python里的self.init,是用來初始化私有變量的,name("unknown")就是給name賦值"unknown"。第一個初始化初始的是默認值,不需要傳入參數,也不需要括號。而public的第二個帶參數的構造函數就需要了,兩者都只能初始化一次。

Person p1;
int x = 13;
std::string name = "Mike";
Person p2(name, x);
p2("x", 1);//常量、變量都可以,但不可重復初始化

我定義的這個name是string型,在構造函數里應該就是const std::string& n=name,這在c里是不合法的,因為n和name的類型不同,但在cpp里這表示拷貝,那n和name地址是否一樣呢?驗證一下

Person(const std::string& n, int a) : name(n), age(a) { std::cout << "init 2 "<<&n <<" " << &name << std::endl; }int x = 13;
std::string name = "Mike";
std::cout << &name << std::endl;
Person p1(name, x);

輸出結果:

000000D8230FFA70
init 2 000000D8230FFA70 000000D8230FFA90

說明Person之前的name和Person里的n是同地址的,而Person里的n和name是不同的,這是因為第一個name是在main里定義的,第二個name是Person的一個private變量,改成std::string xname = "Mike";就好理解了。

接下來的拷貝構造函數是什么呢?如下圖,很明顯,它也是一個拷貝,那么&p3==&p4?當然不是。Person(const Person& other),&p3==&other是成立的,而p4是一個新創建的Person,所以地址不同,Person p4=p3,也是可以直接調用這個拷貝函數的。

int x = 13;
std::string name = "Mike";
Person p3(name, x);
Person p4(p3);
std::cout << "p3 address " << &p3 << std::endl;
std::cout << "p4 address " << &p4 << std::endl;

既然p3,p4地址都不同,那么拷貝之后再變化p3,p4也是不會跟著變化的。

同理我們可以直接如下使用拷貝,顯然,p2=p1會調用之前構造的拷貝函數,但是&p3=p2不會,最后&p3==&p2,但不等于&p1

Person p1;
Person p2=p1;
Person &p3 = p2;
Person &p3 = &p2;//不符合拷貝用法,不能傳入地址
std::cout << "p1 address " << &p1 << std::endl;
std::cout << "p2 address " << &p2 << std::endl;
std::cout << "p3 address " << &p3 << std::endl;

還有需要注意的是,初始化之后再改變x,p2的age也不會變。

int x = 13;
std::string name = "Mike";
Person p2(name, x);
p2.introduce();
x++;
p2.introduce();

最后是析構函數,是在Person的生命周期結束時自動調用的,也可以手動調用,會釋放內存。它們是在棧區的,以p1,p2,p3創建?,就會以p3,p2,p1自動釋放。

Person p1;
Person p2=p1;
Person &p3 = p2;
std::cout << "p1 address " << &p1 << std::endl;
std::cout << "p2 address " << &p2 << std::endl;
std::cout << "p3 address " << &p3 << std::endl;
//p1.~Person();
p2.introduce();
p3.introduce();
p2.change("mike", 23);
p2.introduce();
p3.introduce();

而這個的p3和p2只會釋放一次

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

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

相關文章

基于YOLOv的目標檢測訓練數據構建方法研究—圖像采集、標注、劃分與增強一體化流程設計

在目標檢測任務中,高質量的訓練數據是模型性能提升的關鍵。本文圍繞 YOLOv 系列模型,系統性地研究了目標檢測訓練數據的構建方法,提出了一套從圖像采集、標注、數據集劃分到數據增強的一體化流程設計 。通過多源圖像采集策略確保樣本多樣性,結合 LabelImg 工具完成 VOC 格式…

SQL數據庫操作大全:從基礎到高級查詢技巧

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01; SQL數據庫操作核心語法精要 數據庫基礎操作 創建/刪除數據庫&#xff1a;CREATE DATABASE / DROP DATABASE 備份SQL Server&#xff1a;使用sp_addumpdevice和BACKUP DATABASE命令 數據庫…

[2025]MySQL的事務機制是什么樣的?redolog,undolog、binog三種日志的區別?二階段提交是什么?ACID怎么保證的?主從復制的過程?

MySQL事務機制與日志系統詳解 一、MySQL事務機制 1. 事務特性&#xff08;ACID&#xff09; 特性實現機制原子性(Atomicity)undo log回滾,(事務作為一個整體被執行&#xff0c;包含在其中的對數據庫的操作要么全部被執行&#xff0c;要么都不執行)。一致性(Consistency)約束…

LLama-v2 權重下載

地址&#xff1a;llama模型 官方github倉庫&#xff1a;llama倉庫 注意點 網絡代理位置&#xff1a;美國下面的國家選擇 United States 克隆倉庫后 運行bash download.sh輸入郵箱收到的URL選擇要下載的權重等待下載完成即可 有問題留言&#xff01;&#xff01;&#xff01…

zephyr OS架構下構建Nordic MCU boot

目錄 概述 1. 軟硬件環境 1.1 軟件開發環境 1.2 硬件環境 2 MCU boot 2.1 核心功能 2.2 關鍵術語 2.3 重要字段介紹 3 VS-Code下創建MCU-BOOT項目 3.1 軟件框架結構 3.2 創建測試項目 3.3 編譯項目 3.3 固件在Flash中的分布 4 驗證 4.1 燒寫固件 ? 4.2 代碼…

【Mytais系列】介紹、核心概念

MyBatis 是一款優秀的 持久層框架&#xff0c;它通過簡化 JDBC 操作、提供靈活的 SQL 映射能力&#xff0c;成為 Java 開發中處理數據庫交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析&#xff1a; 一、MyBatis 框架概述 1. 核心定位 作用&#xff1a;將 Java 對象…

IO模型和多路復用

一、IO模型的基礎理解 什么是IO? IO全稱是 Input/Output(輸入/輸出),在計算機科學里主要指程序與外部設備(硬盤、網絡、用戶終端等)進行數據交換的操作。首要特點是: IO通常很慢(從CPU和內存的視角看)經常需要等待外部設備響應1. 為什么要談IO模型? 當一個程序需要…

深入理解 Bash 中的 $‘...‘ 字符串語法糖

在 Bash 腳本編程中&#xff0c;字符串處理是不可或缺的一部分。為了讓開發者更高效地處理特殊字符和控制字符&#xff0c;Bash 引入了一種獨特的字符串語法糖&#xff1a;$&#xff08;帶單引號的 ANSI-C 風格字符串&#xff09;。這種語法來源于 C 語言的 ANSI-C 標準&#x…

用Python打造自己的專屬命令行工具

在日常的開發和使用過程中&#xff0c;我們常常會編寫一些實用的Python腳本&#xff0c;比如用來批量處理文件、獲取系統信息等。然而&#xff0c;每次都要輸入python script_name.py來運行腳本&#xff0c;時間一長難免覺得繁瑣。要是能像使用系統自帶的命令&#xff08;如ls、…

【KWDB 創作者計劃】KWDB 2.2.0多模融合架構與分布式時序引擎

KWDB介紹 KWDB數據庫是由開放原子開源基金會孵化的分布式多模數據庫&#xff0c;專為AIoT場景設計&#xff0c;支持時序數據、關系數據和非結構化數據的統一管理。其核心架構采用多模融合引擎&#xff0c;集成列式時序存儲、行式關系存儲及自適應查詢優化器&#xff0c;實現跨模…

學習Linux的第二天

如何在Linux環境下做開發 Linux的一些基操 Tips&#xff1a;平常最表層的是命令行模式&#xff0c;最多見這個默認叫做命令行模式 Vi操作是什么意思呢 就是在提示符輸入vi a.c 是可以創建一個a.c這個文件并進入這個輸入模式 按i可以輸入代碼 要退出的時候按esc 再按:(冒號…

鏈表操作練習

要求 現在有一個雙向鏈表&#xff0c;里面要保存歌曲的名字&#xff1b;例如 蔡琴/渡口.mp3 我們把它定義在一個link.h文件中。 #ifndef LINK_H #define LINK_H #include <stdlib.h> #include <stdio.h> #include <string.h>typedef struct Node {//保存歌…

MATLAB制作散點圖:從基礎到進階的三種類型講解

一、什么是散點圖 散點圖是一種用來展示兩個或多個變量之間關系的圖表形式。它可以幫助我們直觀地觀察變量之間是否存在相關性、趨勢或異常值&#xff0c;常用于數據分析的初步探索階段。 二、三種類型散點圖 1. 基本二維散點圖&#xff1a;最簡單、最常用 基本二維散點圖的…

模塊方法模式(Module Method Pattern)

&#x1f9e0; 模塊方法模式&#xff08;Module Method Pattern&#xff09; 模塊方法模式是一種結構型設計模式&#xff0c;它將復雜的操作分解成一系列相對簡單、獨立且單一職責的模塊。每個模塊負責完成一種具體的操作&#xff0c;其他模塊或系統可以通過調用這些模塊的公開…

Python中的JSON庫,詳細介紹與代碼示例

目錄 1. 前言 2. json 庫基本概念 3. json 的適應場景 4. json 庫的基本用法 4.1 導 json入 模塊 4.2 將 Python 對象轉換為 JSON 字符串 4.3 將 JSON 字符串轉換為 Python 對象 4.4 將 Python 對象寫入 JSON 文件 4.5 從 JSON 文件讀取數據 4.6 json 的其他方法 5.…

網狐旗艦大聯盟組件源碼私測筆記:結構分層、UI重構與本地實操全流程

作為一套衍生于傳統網狐架構的源碼版本&#xff0c;大聯盟這套源碼組件可謂是在經典基礎上進行了深度重塑。與老版死板的框架風格不同&#xff0c;它不僅對界面做了大刀闊斧的重構&#xff0c;還在組件層級的組織上做了優化。本文將基于一整套源碼進行深度解析&#xff0c;強調…

STM32 PulseSensor心跳傳感器驅動代碼

STM32CubeMX中準備工作&#xff1a; 1、設置AD 通道 2、設置一個定時器中斷&#xff0c;間隔時間2ms&#xff0c;我這里采用的是定時器7 3、代碼優化01 PulseSensor.c文件 #include "main.h" #include "PulseSensor/PulseSensor.h"/******************…

C++項目容易犯錯的點

1. 矩陣q要先定義大小&#xff0c;再賦值。不可以直接賦值。下面這種方式是錯誤的Eigen::MatrixXd q&#xff1b;q<<1,2&#xff1b;正確的這樣的&#xff1a; Eigen::MatrixXd q(2,1); q<<1.4, 1.5; 2. 不要重復加載variables.h頭文件&#xff0c;這樣變量會被…

在阿里云 Ubuntu 24.04 上部署 RabbitMQ:一篇實戰指南

前言 RabbitMQ 是業界常用的開源消息中間件,支持 AMQP 協議,易于部署、高可用、插件豐富。本文以阿里云 ECS 上運行的 Ubuntu 24.04 LTS 為例,手把手帶你完成 RabbitMQ 從倉庫配置到運行的全流程,并分享在國內環境下常見的坑與對應解決方案。 環境概況 操作系統:Ubuntu …

【論文筆記】SOTR: Segmenting Objects with Transformers

【題目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【網…