【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.mzph.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…