类
主要概念
对象:描述客观事物的一个实体,其中包含对象的属性和行为。
类是对对象的抽象化,类会概括对象,抽象起来就是数据与其对应的操作。数据便为静态存储,操作便为动态特征
访问权限修饰符
类中有访问权限修饰符:private,public,protected
被public修饰的函数和属性可以在类的外部被访问,被private修饰的属性只能在类的内部被访问,proteced是受保护对象,protected也只可以在类中或则和其派生类中进行访问
类中的函数
同时类中会有构造函数、析构函数和成员函数
如果在类中没有自己定义构造函数,系统自己定义一个空的构造函数。该函数只负责创建对象,不做初始化工作,当类中定义了任何形式的构造函数时,系统便不在产生默认构造函数了。
构造函数可以进行函数重载
构造函数的格式如下:
类名::类名(参数列表)
{
函数体;//有关初始化的代码
}
同样成员函数也可以进行重载
成员函数的格式如下:
返回值类型 类名::函数名 (参数列表)
{
函数体;
}
类中的析构函数是一个特殊的成员函数,用于在对象销毁时执行必要的清理工作,同时如果是一个派生类,其还会调用其基类的析构函数
析构函数的格式如下: ~类名()
{
函数体;
}
类的特点
类定义后,可以视为一种新的数据类型,可以使用指针指向该类,也可以进行和其他数据类型类似的操作。
成员初始化列表
初始化的作用,格式如下:
假设类中x和y两个属性参量,假设在构造函数中运用成员初始化列表
类名::类名 (参数列表 (参数1和参数2)):x(参数1名字),y(参数2名字){}
必须要使用成员初始化列表的情况
-
该类的成员变量是个引用
-
该类的成员变量是const型
-
该类是继承一个基类,并且基类中有构造函数,构造函数中有参数
-
该类的成员变量是一个类的类型,而且该类的构造函数带有参数时
成员初始化练列表中,会优先函数体来执行,可以使得参数提前传好。
this指针
this指针用于指向当前对象的地址,在类的成员函数中,this指针可以自动获取当前对象的地址,并且可以显式地使用它来访问当前对象的成员变量和成员函数
同时this指针本质是一个指针常量,他存储了调用他的对象的地址,并且不可以被修改
this指针的特点
-
this指针是一个隐含的指针,在每个成员函数中都存在,无需显式声明
-
this指针是指向当前类的指针
-
this指针是在成员函数的开始前构造,并在成员函数的结束后清除
-
在调用成员函数时,编译器会自动将当前对象的地址传递给this指针
访问方式如下:
this-> 成员函数
this->成员变量
类的继承与派生
继承是保持已有类的特性而构造新类的过程,派生是在已有类的基础上新增自己的特性而产生新类的过程。被继承的已有类称为基类(或父类),派生出的新类称为派生类(或子类)。
语法格式:
class 派生类: 继承访问控制 基类{
public:
共有成员列表
protected:
受保护成员列表
private:
私有成员列表
};
如何记忆,首先需要声明一个类对象,这个类对象是来自基类的后面就紧跟着基类就好了
类成员的访问控制规则,✔表示可以访问,✘表示不可以访问
继承访问控制 | 基类(类本身) | 派生类 | 其他类或函数 |
---|---|---|---|
public | ✔ | ✔ | ✔ |
protected | ✔ | ✔ | ✘ |
private | ✔ | ✘ | ✘ |
在派生类通过继承访问控制继承基类后,继承的函数的访问规则如下
简单来说,通过public继承的成员函数,在派生类中会保留其访问权限
通过private继承的派生类中的成员函数都会变成私有,只可以在该派生类中访问,也不可以派生
通过protected继承的基类中的成员函数,都会收到保护,只可以在该派生类中,但仍然可以作为基类,将上述成员函数派生给下一个派生类。
在派生类继承基类后,优先启动基类的构函数;优先启动派生类的析构函数。
演示代码:
#include<iostream> using namespace std; class a { public: a() { cout << "基类进行创建" << endl; } ~a() { cout << "基类进行销毁" << endl; } }; class b :protected a { public: b() { cout << "派生类进行创建" << endl; } ~b() { cout << "派生类进行销毁" << endl; } }; int main() { b xx; return 0; }
演示结果
派生类中可以不去定义构造函数的情况:
-
基类中没有定义构造函数
-
基类的构造函数为无参构造或着全部参数都指定了默认值
派生类中必须定义构造函数的情况:
基类或者成员对象所属类中只含有带参数的构造函数时
但因为构造函数运行时,会首先执行基类的构造函数,所以需要优先将参数传递给基类的构造函数,即需要使用到成员初始化列表,来实现基类的提前构造
首先需要调用基类的构造函数
eg
派生类名字 (参数列表):基类的名字(参数列表)
{
函数体;
}
string
-
size
/length
-
用法: 获取字符串的长度。
-
原型
:
size_type size() const noexcept; size_type length() const noexcept;
-
参数: 无。
-
返回值:
size_type
- 字符串中字符的数量。
-
-
empty
-
用法: 检查字符串是否为空。
-
原型
:
bool empty() const noexcept;
-
参数: 无。
-
返回值:
bool
- 如果字符串为空则返回true
,否则返回false
。
-
-
clear
-
用法: 清空字符串内容。
-
原型
:
void clear() noexcept;
-
参数: 无。
-
返回值: 无。
-
-
append
-
用法: 向字符串末尾添加字符或另一个字符串。
-
原型
:
string& append(const string& str); string& append(const string& str, size_type subpos, size_type sublen); string& append(const char* s); string& append(const char* s, size_type n); string& append(size_type n, char c); template<class InputIt> string& append(InputIt first, InputIt last);
-
参数: 根据不同的重载,参数可以是字符串、C字符串、字符或迭代器范围。
-
返回值:
string&
- 追加操作后的字符串自身的引用。
-
-
insert
-
用法: 在字符串指定位置插入字符或另一个字符串。
-
原型
:
string& insert(size_type pos, const string& str); string& insert(size_type pos, const string& str, size_type subpos, size_type sublen); string& insert(size_type pos, const char* s); string& insert(size_type pos, const char* s, size_type n); string& insert(size_type pos, size_type n, char c); iterator insert(const_iterator p, char c); iterator insert(const_iterator p, size_type n, char c); template<class InputIt> iterator insert(const_iterator p, InputIt first, InputIt last);
-
参数: 根据不同的重载,参数可以是位置、字符串、C字符串、字符、迭代器范围等。
-
返回值:
string&
- 插入操作后的字符串自身的引用或指向新插入字符的迭代器。
-
-
erase
-
用法: 从字符串中移除字符。
-
原型
:
string& erase(size_type pos = 0, size_type len = npos); iterator erase(const_iterator p); iterator erase(const_iterator first, const_iterator last);
-
参数: 位置和长度或迭代器范围。
-
返回值:
string&
- 删除操作后的字符串自身的引用或指向删除后下一个字符的迭代器。
-
-
substr
-
用法: 返回一个子字符串。
-
原型
:
string substr(size_type pos = 0, size_type len = npos) const;
-
参数: 起始位置和长度。
-
返回值:
string
- 子字符串。
-
-
find
-
用法: 查找子字符串或字符在字符串中的位置。
-
原型
:
size_type find(const string& str, size_type pos = 0) const noexcept; size_type find(const char* s, size_type pos = 0) const; size_type find(const char* s, size_type pos, size_type n) const; size_type find(char c, size_type pos = 0) const noexcept;
-
参数: 子字符串、C字符串或字符,以及起始查找位置。
-
返回值:
size_type
- 首次出现的位置,如果未找到则返回npos
。
-
-
replace
-
用法: 替换字符串中的部分内容。
-
原型
:
string& replace(size_type pos, size_type len, const string& str); string& replace(const_iterator i1, const_iterator i2, const string& str); string& replace(size_type pos, size_type len, const char* s); string& replace(const_iterator i1, const_iterator i2, const char* s); string& replace(size_type pos, size_type len, const char* s, size_type n); string& replace(const_iterator i1, const_iterator i2, const char* s, size_type n); string& replace(size_type pos, size_type len, size_type n, char c); string& replace(const_iterator i1, const_iterator i2, size_type n, char c); template<class InputIt> string& replace(const_iterator i1, const_iterator i2, InputIt first, InputIt last);
-
参数: 位置、长度、字符串、C字符串、字符或迭代器范围。
-
返回值:
string&
- 替换操作后的字符串自身的引用。
-
-
compare
-
用法: 比较字符串。
-
原型
:
int compare(const string& str) const noexcept; int compare(size_type pos1, size_type len1, const string& str) const; int compare(size_type pos1, size_type len1, const string& str, size_type pos2, size_type len2) const; int compare(const char* s) const noexcept; int compare(size_type pos1, size_type len1, const char* s, size_type n) const;
-
参数: 要比较的字符串或C字符串及其位置和长度。
-
返回值:
int
- 比较结果(负值表示小于,零表示等于,正值表示大于)。
-
-
c_str
-
用法: 获取C风格字符串指针。
-
原型
:
const char* c_str() const noexcept;
-
参数: 无。
-
返回值:
const char*
- 指向字符串内容的C字符串指针。
-
-
data
-
用法: 获取指向字符串数据的指针。
-
原型
:
const char* data() const noexcept; char* data() noexcept; // C++17起可用
-
参数: 无。
-
返回值:
const char*
- 指向字符串内容的指针。
-