【C++ grammar】對象和類(創建對象、對象拷貝、分離聲明與實現)

目錄

  • 1、用類創建對象
    • 1、面向對象的特征
    • 2、對象由什么構成
    • 3、如何定義對象
    • 4、創建對象并訪問對象成員
      • 1. Constructors(構造函數)
      • 2. Constructing Objects (創建對象)
      • 3. Object Member Access Operator(對象訪問運算符)
  • 2、對象拷貝以及分離聲明與實現
    • 1、類是一種數據類型
      • 1.1. 定義變量的例子:
      • 1.2. 定義對象的例子:
    • 2. Memberwise Copy (成員拷貝)
    • 3、匿名對象
    • 4、局部類和嵌套類
    • 5、question-是否存在匿名對象?
  • 3、Separating Declaration from Implementation
    • 1、C中的用法
    • 2、Separating Declaration from Implementation
    • 3、Inline Declaration & Inline Function
    • 4、注意事項
  • 4、避免頭文件被多次包含

1、用類創建對象

1、面向對象的特征

(1) Abstraction (抽象)
(2) Polymorphism (多態)
(3) Inheritance (繼承)
(4) Encapsulation (封裝)

2、對象由什么構成

對象具有唯一的標識、狀態和行為。
對象狀態由數據域(也稱為“屬性”)及其當前值構成。
對象的行為由一組函數定義。

3、如何定義對象

對象是類的實例。
類包含:
1、由變量定義的數據域
2、由函數定義的行為
類中有兩種特殊的函數:
constructors : (構造函數:在創建對象時被自動調用)
destructors : (析構函數:在對象被銷毀時被自動調用)

4、創建對象并訪問對象成員

1. Constructors(構造函數)

class Circle {
public:// The radius of this circledouble radius;// Construct a circle objectCircle() {radius = 1;}// Construct a circle objectCircle(double newRadius) {radius = newRadius;}// Return the area of this circledouble getArea() {return radius * radius * 3.14159;}
};

Ctors的特點:

(1) Automatic invocation(自動調用)
(2) Has the same name as the defining class (與類同名)
(3) NO return value (including “void”);(無返回值)
(4) Can be overloaded (可重載)
(5) May have no arguments (可不帶參數)

類可不聲明構造函數,編譯器會提供一個帶有空函數體的無參構造函數,只有當未明確聲明構造函數時,編譯器才會提供這個構造函數,并稱之為“默認構造函數”。

2. Constructing Objects (創建對象)

Circle circle1;   // 正確,但不推薦這樣寫
Circle  circle2(); // 錯誤!C++編譯器認為這是一個函數聲明
Circle  circle3{}; // 正確,推薦寫法。這里面明確顯示用空初始化列表初始化circle3對象(調用Circle默認構造函數)Circle circle2{ 5.5 }; // C++11 列表初始化// 帶有窄化檢查(narrowing check)

3. Object Member Access Operator(對象訪問運算符)

#include <iostream>
using namespace std;
class Circle {
public:// The radius of this circledouble radius;// Construct a circle objectCircle() {radius = 1;}// Construct a circle objectCircle(double newRadius) {radius = newRadius;}// Return the area of this circledouble getArea() {return radius * radius * 3.14159;}
};int main() {Circle circle1;Circle circle2(5.0);cout << "The area of the circle of radius " <<circle1.radius << " is " << circle1.getArea() << endl;cout << "The area of the circle of radius " <<circle2.radius << " is " << circle2.getArea() << endl;// Modify circle radiuscircle2.radius = 100.0;cout << "The area of the circle of radius " <<circle2.radius << " is " << circle2.getArea() << endl;return 0;
}

2、對象拷貝以及分離聲明與實現

用類聲明一個實體的說法,與定義變量的說法有些不同:用原生數據類型定義變量,用類名定義對象。

1、類是一種數據類型

1.1. 定義變量的例子:

// primitive data type è variablesdouble d1;  //未初始化double d2(3.3);  int  x1{2.0}; //error: Narrowingint  x2={4};auto i{x};decltype(d1) j;

1.2. 定義對象的例子:

// class è objectsCircle c1;      //調用Circle的默認ctorCircle c2(5.5); //調用Circle的有參ctorCircle c3{5.5}; // 直接列表初始化,調有參ctorCircle c4 = {5.5}; // 拷貝列表初始化,調ctorauto c5 = Circle{2.}; // auto類型推斷decltype(c1) c6;      // decltype類型推斷

2. Memberwise Copy (成員拷貝)

1、使用賦值運算符: =
2、默認情況下,對象中的每個數據域都被拷貝到另一對象的對應部分
circle2 = circle1;
(1) 將circle1 的radius 拷貝到circle2 中
(2) 拷貝后:circle1 和 circle2 是兩個不同的對象,但是半徑的值是相同的。( 但是各自有一個radius 成員變量)

3、匿名對象

Occasionally, you may create an object and use it only once. (有時需要創建一個只用一次的對象)

An object without name is called anonymous objects. (這種不命名的對象叫做匿名對象)

Example

int main() {Circle c1 = Circle{1.1};auto c2 = Circle{2.2}; // 用匿名對象做拷貝列表初始化Circle c3{};           // 直接列表初始化,調默認Ctorc3 = Circle{3.3};      // 用匿名對象賦值cout << "Area is " << Circle{4.2}.getArea() << endl;cout << "Area is " << Circle().getArea() << endl;  // 不推薦cout << "Area is " << Circle(5).getArea() << endl; // 不推薦return 0;
}

4、局部類和嵌套類

Local class : a class declared inside a function (局部類是在一個函數中聲明的類)

void f(){class C { // C及其對象只在f()中可用 void g() { // 成員函數必須在C中實現/* 訪問f()的成員受限 ……. */}};C c1, c2;
}

Nested class: a class declared in another enclosing class (嵌套類是在另一個類中聲明的類)

class E{class N { // N及其對象可訪問E的成員 /* 聲明N的成員 ……. */}};C c1, c2;}

5、question-是否存在匿名對象?

question description:
Circle類接受一個double參數構造其對象,那么

Circle c1 = { 1.0 };
Circle c2 = Circle {1.0};

這兩條語句的執行結果是相同的,c1和c2都是一個半徑為1.0的圓對象。
但是,這兩條語句執行過程是否一樣呢?第一條語句的等號右側是否也構造了一個匿名對象呢?

兩者的執行結果是一樣的,都是將c1和c2對象的半徑賦值1.0。
但是執行過程是不一樣的,c1是通過拷貝列表初始化的方式賦值;c2是通過匿名對象拷貝的方式賦值。

3、Separating Declaration from Implementation

在聲明之后,定義之前,類為不完整類型,只能用于指向該類型的指針或者引用或者
用于聲明使用該類型作為形參類型或者返回類型的函數。

解決方法:
1、將函數的實現放在類聲明的最下面
2、將類的聲明放在一個頭文件中,類的實現放在另一個文件中。

1、C中的用法

// GetArea.h:
float getArea (float radius);// GetArea.cpp:
#include "GetArea.h"
float getArea (float radius) {return radius*radius*3.14;
} 
//main.c:
#include "GetArea.h"
int main() {int result=getArea(2.0;return 0;
}

2、Separating Declaration from Implementation

(1) .h: 類聲明,描述類的結構
(2) .cpp: 類實現,描述類方法的實現
FunctionType ClassName :: FunctionName (Arguments) { //… }
其中,:: 這個運算符被稱為binary scope resolution operator(二元作用域解析運算符),簡稱“域分隔符”

Circle.h

//Circle.h
class Circle{double radius;
public:Circle();Circle(double radius_);double getArea();
};

Circle.cpp

Circle::Circle(){radius=1.0;
}
Circle::Circle(double radius_){radius=radius_;
}
double Circle::getArea(){return (3.14 * radius * radius);
}

main.cpp

//main.cpp
int main(){Circle c1;Circle c2 {2.0};std::cout << c1.getArea() << std::endl;return 0;
}

3、Inline Declaration & Inline Function

1、當函數在類聲明中實現,它自動成為內聯函數

class A {
public:A() = default; //C++11,編譯器識別后一定會生成一個默認的構造函數double f1() {  // f1自動稱為內聯函數// do something} double f2();
};
double A::f2() {  // f2不是內聯函數//do something}

2、當函數在類的外部實現,加上inline也會成為內聯函數

class A {
public:A() = default; //C++11double f1();double f2();
};
double A::f2() {//do something
}
inline double A::f1() { // f1是內聯函數//do something
}

4、注意事項

1.      //a.h
2.      void f();
3.       
4.      // a.cpp
5.      #include "a.h"
6.      void f() {}
7.       
8.      //main.cpp
9.      #include "a.h"
10.  void f() {}

第6行和第10行構成了語法錯誤:重定義函數
但是 Compiler 不報錯,這個錯誤只能在link階段才能檢測出來。

4、避免頭文件被多次包含

例1:

#ifndef  MY_HEADER_FILE_H#define MY_HEADER_FILE_H//  頭文件內容#endif

例2:

#pragma once       // C++03, C90

例3

_Pragma("once")  // C++11, C99;		_Pragma是一個運算符

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

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

相關文章

十一、圖像二值化

一、二值圖像 其實就是把圖像轉換為只有黑白的兩種顏色圖像&#xff0c;即像素值非零即一 三角閾值二值化 對一個圖像進行操作&#xff0c;獲取圖像的直方圖&#xff0c;找到波峰和波谷進行連線設為線段A&#xff0c;每個點做有關線段A的垂線垂足在線段A上&#xff0c;最后將…

百度地圖LV1.5實踐項目開發工具類bmap.util.jsV1.2

/*** 百度地圖使用工具類-v1.5* * author boonya* date 2013-7-7* address Chengdu,Sichuan,China* email boonyasina.com* company KWT.Shenzhen.Inc.com* notice 有些功能需要加入外部JS庫才能使用&#xff0c;另外還需要申請地圖JS key .* 申請地址&#xff1a;http…

isatty_帶有示例的Python File isatty()方法

isatty文件isatty()方法 (File isatty() Method) isatty() method is an inbuilt method in Python, it is used to check whether a file stream is an interactive or not in Python i.e. a file stream is connected to a terminal device. If a file is connected to a ter…

地毯店 如何辨別地毯的好壞?

在實地選購地毯品牌時&#xff0c;許多地方需要引起注意&#xff0c;而且要顯得專業&#xff0c;這樣才能科學深入地辨別地毯的好壞。比如&#xff0c;辨明拉絞地毯和抽絞地毯兩種工藝的打結方法幾乎相同&#xff0c;只是變絞形式上有所區別。抽絞的方式較古老&#xff0c;一般…

十二、圖像金字塔

一、原理 reduce高斯模糊降采樣 expand擴大卷積 PyrDown&#xff1a;降采樣 PyrUp&#xff1a;還原 二、高斯金字塔 import cv2 import numpy as np from matplotlib import pyplot as pltdef pyramid(image):level 3temp image.copy()pyramid_image []for i in range(le…

java uuid靜態方法_Java UUID toString()方法與示例

java uuid靜態方法UUID類toString()方法 (UUID Class toString() method) toString() method is available in java.util package. toString()方法在java.util包中可用。 toString() method is used for string denotation of this UUID. toString()方法用于此UUID的字符串表示…

LeetCode 110. 平衡二叉樹思考分析

題目 給定一個二叉樹&#xff0c;判斷它是否是高度平衡的二叉樹。 本題中&#xff0c;一棵高度平衡二叉樹定義為&#xff1a; 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。 示例 1: 給定二叉樹 [3,9,20,null,null,15,7] 3 / 9 20 / 15 7 返回 true 。 示例 2…

Redhat配置XDMCP及相關linux命令

為了能夠使用 Xwin32 或 Xmanager 登錄到 Linux 主機所進行的配置。需要首先在linux上進行相關配置 1.“系統”菜單中選擇“管理”下的“登錄屏幕” 2.出現“登錄窗口首選項”窗口。選擇“遠程”選項卡&#xff0c;將“樣式”改為:“與本地相同” 3.選擇“安全”選項卡&#xf…

充實的日子里忙忙碌碌

實習已經有一個多月了&#xff0c;話說這個月發工資就有我的份兒了&#xff0c;哇咔咔~~~感覺忙忙碌碌的生活其實很充實的。工作日每天都是7點10分左右起來&#xff0c;8點半到公司買早飯吃東西&#xff0c;9點上班開工。先羅列要干的東西&#xff0c;然后一項一項完成&#xf…

十三、圖像梯度

一、兩種算子 一階導數—Sobel算子 水平梯度&#xff1a; 垂直梯度&#xff1a; 最終圖像梯度&#xff1a; 二階導數—Laplacian算子 在二階導數的時候&#xff0c;最大變化處的值為零&#xff0c;即邊緣是零值。 常見的拉普拉斯算子&#xff1a;、其所有元素之和為零。…

Java Formatter out()方法與示例

格式化程序類out()方法 (Formatter Class out() method) out() method is available in java.util package. out()方法在java.util包中可用。 out() method is used to get Appendable for the output. out()方法用于獲取輸出的Appendable。 out() method is a non-static meth…

SQL2008,SQL2005存儲過程解密

SQL2008,SQL2005存儲過程解密 下載&#xff1a;附件 SQL2008,SQL2005存儲過程解密第一步操作步驟&#xff1a;程序->Sql Server2005-> 配置工具-> Sql Server 外圍應用配置器-> 功能的外圍應用配置器-> DataBase Engine-> DAC -> 啟用遠程DAC 第二步&a…

LeetCode 257. 二叉樹的所有路徑 思考分析

目錄題目思路一&#xff1a;深度遞歸思路二&#xff1a;廣度迭代關于回溯題目 給定一個二叉樹&#xff0c;返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 輸入: 輸出: [“1->2->5”, “1->3”] 解釋: 所有根節點到葉子節點的路…

自定義django的Template context processors

簡要步驟&#xff1a; 1.編輯一個函數: def media_url(request):from django.conf import settingsreturn {media_url: settings.MEDIA_URL}2.配置settings&#xff1a; TEMPLATE_CONTEXT_PROCESSORS (myapp.context_processors.media_url,) 3.確保幾點&#xff1a; 1&#xf…

十四、Canny邊緣提取

一、算法步驟 1&#xff0c;對圖像進行GaussianBlur(高斯模糊)消除一些噪聲 2&#xff0c;對圖像進行灰度轉換cvtColor 3&#xff0c;計算梯度Sobel/Scharr 4&#xff0c;非最大信號抑制 5&#xff0c;高低閾值輸出二值圖像 設定兩個閾值T1和T2&#xff0c;凡是高于T2的都保…

scanner close_Java Scanner close()方法與示例

scanner close掃描器類close()方法 (Scanner Class close() method) close() method is available in java.util package. close()方法在java.util包中可用。 close() method is used to close this Scanner object when opened otherwise this method does not affect. 當打開…

flex3.0中打包的方法swc

flex3.0中打包的方法&#xff1a; 1. 新建一個 flex library project 2. 彈出的對話框 點 next ,在Classes下&#xff0c;找到Main source folder 點瀏覽 3. 選擇你新建的文件夾 點 new 然后點擊 OK 4. 這個時候 Classes 下多了個src 文件夾&#xff0c;打開源文件夾&#xf…

Java Hashtable get()方法與示例

哈希表類的get()方法 (Hashtable Class get() method) get() method is available in java.util package. get()方法在java.util包中可用。 get() method is used to return the value associated with the given key element (key_ele) in this Hashtable. get()方法用于返回與…

圖解PCB布線數字地、模擬地、電源地,單點接地抗干擾!

我們在進行pcb布線時總會面臨一塊板上有兩種、三種地的情況&#xff0c;傻瓜式的做法當然是不管三七二十一&#xff0c;只要是地 就整塊敷銅了。這種對于低速板或者對干擾不敏感的板子來講還是沒問題的&#xff0c;否則可能導致板子就沒法正常工作了。當然若碰到一塊板子上有多…

十五、霍夫直線檢測

一、自定義 import cv2 import numpy as np from matplotlib import pyplot as pltdef line_detection(image):gray cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)edges cv2.Canny(gray,50,150,apertureSize3)lines cv2.HoughLines(edges,1,np.pi/180,200)for line in lines:rho…