C++面向对象程序设计学习笔记(4)
类与对象(2)
string类
C++不仅向下兼容C的字符表示方法,也声明了一种更方便的字符串类型,即string类。
想要使用string类,必须包括头文件string,即要声明
#include<string>
string的声明方法与其他自定义的对象一样,也需要先定义后使用
string类增加了许多的运算符具体可见
向函数传递对象
使用对象作为函数参数:该方法与正常使用函数传递参数的方法一致,在函数中对对象的修改不影响对象本身。
使用对象指针作为函数参数:该方法与正常使用函数传递参数指针的方法一致,在函数中对对象的修改影响对象本身。
使用对象引用作为函数参数:该方法与使用指针效果一致,但更加简单、直接,例:
void fun(tmp &a) {}
对象的赋值和复制
对象赋值语句
使用运算符'='即可将运算符后的数据成员的值赋给前一个对象。
注意:
两个对象的类型必须相同。
赋值后两个对象依旧是分离的,一个对象的变化不会影响另一个。
当对象中存在指针时,不可以直接使用该方法进行赋值。
拷贝构造函数
拷贝构造函数的作用就是在使用一个已有的对象来对一个新建立的对象初始化
特点
(1)没有返回值
(2)只有一个参数,而且是对同类对象的引用
(3)每个类必须有一个拷贝构造函数,该拷贝构造函数可以是自己定义的,若无定义则系统会自动生成一个默认的拷贝构造函数。
自定义拷贝构造函数
自定义拷贝构造函数一般形式如下:
类名::类名(const 类名 &对象名)
{
//拷贝构造函数的函数体
}
调用拷贝构造函数的一般形式为:
类名 对象2(对象 1);
还可以使用赋值法调用拷贝构造函数:
类名 对象 2=对象 1
默认拷贝构造函数
若无定义则系统会自动生成一个默认的拷贝构造函数,用于复制一个完全相同的新对象。
注意:若存在指针类型则不可以使用默认拷贝构造函数。
调用拷贝构造函数的情况
(1)使用类的一个对象来初始化另一个对象时。
(2)函数的形参是类的对象,调用函数进行实参和形参结合时。
(3)函数返回值是类的对象,函数调用完毕将返回值带回函数调用处时。
静态成员
静态数据成员
在一个类中,若将一个数据成员说明为static,这种成员称为静态数据成员,无论建立多少个类的对象,都只有一个静态数据成语的拷贝。
定义静态数据成语的格式如下:
static 数据类型 数据成员名;
注意:
(1)静态数据成员的初始应在类外单独进行,且在定义对象之前进行,初始化格式如下:
数据类型 类名 ::静态数据成员=初始值;
(2)静态数据成员属于类,因此可以使用"类名::"访问静态数据成员,格式如下:
类名::静态数据成员名
(3)公有的静态数据成员可以在对象定义之前被访问。对象定义后,也可以通过对象进行访问,格式如下:
对象名.静态数据成员名
对象指针->静态数据成员名
静态成员函数
若将一个成员函数说明为static,这种成员称为静态成员函数。静态成员函数属于整个类,是该类中所有对象共享的成员函数,而不属于类中的某个对象,定义静态成员函数的格式如下:
static 返回类型 静态成员函数名(函数表);
调用静态成员函数的方式有多种:
类名::静态成员函数名(实参表)
对象.静态成员函数名(实参表)
对象指针->静态成员函数名(实参表)
注意:
(1)一般情况下,静态成员函数主要用于访问静态数据成员。
(2)静态成员函数可以用在建立任何对象之前调用静态成语函数,以处理静态数据成员。
(3)静态成员函数是类的一部分,而不是对象的一部分,因此在类外调用静态成员函数最好使用以下格式:
类名::静态成员函数名()
(4)静态成员函数不会与其他文件中的同名函数发生冲突。
(5)静态成员函数没有this指针,若需要访问该对象的非静态成员,需要通过对象名(对象指针、对象引用)。
友元
友元是用于在类的外部访问类的私有成员的一种辅助手段,其既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,是独立于当前类的外部函数。
在类中声明友元函数时,需要在函数名前加关键字friend,可以定义在类的外部或是类的内部。
将非成员函数声明为友元函数
例:
class tmp
{
private:
int a,b;
public:
tmp(int _a,int _b):a(_a),b(_b){}
friend void show(tmp &t)
{
cout<<t.a<<' '<<t.b<<endl;
}
};
int main()
{
tmp t(1,2);
show(t);
return 0;
}
注意:
(1)友元函数不是类的成员函数,因此在类外访问友元函数不需要将"类名::"。
(2)友元函数不是类的成员,所以不能直接访问对象的数据成语,也不能用this指针,必须通过参数传递来的对象名(对象指针、对象引用)来访问引用该对象的数据成员。
(3)访问时必须加上对象名。
注意使用友元函数破坏了数据的隐蔽性和类的封装性,因此使用友元函数需谨慎。
将成员函数声明为友元函数
一个类的成员函数也可以成为另一个类的友元。
注意:
(1)一个类的成员函数成为另一个类的友元函数前,必须先定义这个类,在声明这个友元函数时要加上成员函数所在类的类名。
(2)若未声明可在类前加"class 声明类;",提前声明。
友元类
一个类也可以成为另一个类的友元,声明方法是在另一个类声明中加入语句 friend 类名
。
当类Y被说明为类X的友元时,类Y的所有成员函数都成为类X的友元函数,这就意味着作为友元类Y中的所有成员函数都可以访问类X中的所有成员。
注意:友元关系是单向的,不具有交换性,也不具有传递性。
类的组合
在一个类中内嵌另一个类的对象作为数据成员,称为类的组合。内嵌对象称为对象成员,也称为子对象。
当创建类对象是,若该类具有内嵌的对象成员,那么内嵌对象成员也将被自动创建。
一般来说这种类的构造函数的定义形式为:
X::X(形参表 0):对象成员 1(形参表 1),对象成员 2(形参表 2)......
{
//类X的构造函数体
}
在调用构造函数X::X()时,根据对象成员在类声明中的顺序一次调用它们的构造函数,对这些对象初始化,最后执行类X的构造函数体,析构函数的调用顺序相反。
常类型
常类型是指使用修饰符const说明的类型,其变量或对象成员的值在程序运行期间是不可改变的。
常引用
若在说明引用时使用修饰符const,则该引用即为常引用,其作为形参不会对实参产生修改,说明形式为:
const 类型 &引用名;
常对象
若在说明对象时使用修饰符const,则该对象即为常对象,其数据成员在对象的整个生存期中不会改变,说明形式为:
const 类型 对象名[(参数表)];
或
类型 const 对象名[(参数表)];
常对象必须初始化且不能进行更新
常对象成员
常数据成员
使用修饰符const说明的数据成员称为常数据成员,常数据成员只能通过成员初始化列表对该数据成员进行初始化,其他任何函数都不能对其赋值
常成员函数
使用修饰符const明的成员函数称为常成员函数,说明格式如下:
类型说明符 函数名 (参数表) const;
const是函数类型的一个组成部分,在声明函数和定义函数时都要有关键字const,在调用时不需要加const。
注意:
(1)
数据成员 | 普通成员函数 | 常成员函数 |
---|---|---|
普通数据成员 | 可以访问,也可以改变值 | 可以访问,不可以改变值 |
常数据成员 | 可以访问,不可以改变值 | 可以访问,不可以改变值 |
常对象的数据成员 | 不允许访问,不可以改变值 | 可以访问,不可以改变值 |
(2)常成员函数是常对象的唯一的对外接口
C++面向对象程序设计学习笔记(4)的更多相关文章
- C++面向对象程序设计学习笔记(1)
基本概念 对象: 面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体,每个对象都是由数据和操作代码两部分构成的. 类: 面向对象程序设计中,类是具有相同的数据 ...
- C++面向对象程序设计学习笔记(6)
多态性 编译时的多态性与运行时的多态性 在面向对象方法中,所谓多态性就是不同对象收到相同信息时,产生不同的行为.在c++程序设计中,即"一个接口,多种方法" 在C++中,多态性的实 ...
- C++面向对象程序设计学习笔记(7)
模板与异常处理 模板的概念 模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型作为参数. 模板分为函数模板和类模板,它们分别允许用户构造模板类和模板函数 函数模板与模板函数 函数模板实际 ...
- C++面向对象程序设计学习笔记(5)
派生类与继承 概念 继承允许编程者在已有类的基础上创建新的类,可以从一个或者多个已有类中继承函数和数据,并重新定义或者添加新的函数和数据,已有类称为基类或父类,新类称为派生类和子类. 声明 声明一个派 ...
- C++面向对象程序设计学习笔记(3)
类与对象(1) 结构体与类 结构体的扩充 C++对结构体进行了扩充,它不仅可以含有不同类型的数据,还可以含有函数,结构体的函数可以像访问结构体中的数据一样进行访问. 类的声明 声明类的方法与声明结构体 ...
- C++面向对象程序设计学习笔记(2)
C++在非面向对象方面的扩充 C++向下兼容C语言,因此C语言中的语法在C++中依然成立 输入输出 C++添加了标准输入流对象cin和标准输出流对象cout来进行输入输出, 例: #include&l ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- Java程序设计学习笔记(一)
时间:2015-6-2 23:04 程序员,程序猿,程序媛,码农 ------------------------------------------------------- --Java的应用 ...
- JavaScript高级程序设计---学习笔记(二)
面向对象程序设计1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直 ...
随机推荐
- 物联网架构成长之路(40)-Bladex开发框架入门
0. 前言 前一小节,讲了如何入门,这里就简单讲一下如何自定义查询和权限控制配置. 1. 配置多租户 如果要启用该表的多租户功能,需要在application.yml 这里配置. 2. 配置模糊匹配 ...
- 微信小程序开发-蓝牙功能开发
0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数 ...
- 【VS开发】COM组件技术概述
这篇文章对COM做出来比较完整的解释,非常好. COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样功能专一的组件,然后将它 ...
- 【shell脚本】通过位置变量创建Linux账户及密码===addUser.sh
通过位置变量创建Linux账户及密码 脚本内容 [root@VM_0_10_centos shellScript]# vi addUser.sh #!/bin/bash # 通过位置变量创建系统账户及 ...
- 什么是IDE(集成开发环境)?
实际开发中,除了编译器是必须的工具,我们往往还需要很多其他辅助软件,例如: 编辑器:用来编写代码,并且给代码着色,以方便阅读: 代码提示器:输入部分代码,即可提示全部代码,加速代码的编写过程: 调试器 ...
- redis的3种过期键删除策略
Redis的过期键的过期时间都保存在过期字典中,过期键的删除策略有三种,分别是定时删除.惰性删除和定期删除. 定时删除 定时删除策略,是指在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时 ...
- 搜索旋转排序数组II
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [,,,,,,] 可能变为 [,,,,,,] ). 编写一个函数来判断给定的目标值是否存在于数组中.若存在返回 true, ...
- C# if-else 语句
一.简介 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行. 二.语法 If(判断条件) { 执行的代码: } else { 执行的代码: } 描述: 执行 ...
- C# 改变控制台背景颜色
之前查找静态构造函数相关的问题无意间碰到的一个问题.改变控制台的背景颜色. static void Main(string[] args) { //设置绿色 Console.BackgroundCol ...
- 百度编辑器上传视频报Http请求错误,.net实现方式
在使用百度编辑器上传视频的时候遇到一个很奇怪的问题,当视频大小在20M以下的时候,上传正常.当大于20M时,一直报Http请求错误. 处理步骤: 1.修改编辑器配置信息,如图所示,改成你想要的大小 2 ...