C++详细笔记(五)

1.类和对象

1.1运算符重载(补)

1.运算符重载中,参数顺序和操作数顺序是一致的。

2.一般成员函数重载为成员函数,输入流和输出流重载为全局函数。

3.由1和2只正常的成员函数默认第一个参数为this指针而重载中参数顺序和操作数顺序要一致,则导致使用时为d<<cout;(不符合使用习惯正常为:cout<<d<<endl).

cpp 复制代码
void Date::operator<<(ostream& out)
{
	return out << _year << "年" << _month << "月" << _day << "日" << endl;
}
//全局声明
ostream& operator(ostream& out ,const Date d);
istream& operator(istream& in, Date d);

1.2友元函数

在 C++ 中,友元函数是一种特殊的函数。它可以访问类的私有成员和保护成员,尽管它不是该类的成员函数。

一、友元函数的作用

友元函数的主要作用是在不破坏类的封装性的前提下,允许特定的函数访问类的私有成员。这在某些情况下非常有用,例如:

  1. 提高程序的效率:如果某些操作需要频繁访问类的私有成员,使用友元函数可以避免通过成员函数的接口进行访问,从而提高程序的执行效率。
  2. 实现特定的功能:在某些情况下,需要在类的外部实现一些与类相关的功能,而这些功能需要访问类的私有成员。友元函数可以提供一种方便的方式来实现这些功能。

二、友元函数的声明和定义

1.声明友元函数:在类的内部,可以使用 friend 关键字声明友元函数

cpp 复制代码
class MyClass {
private:
    int privateData;
public:
    MyClass(int data) : privateData(data) {}
    friend void friendFunction(MyClass& obj);
};

2.定义友元函数:友元函数的定义可以在类的外部进行,就像普通函数一样。

cpp 复制代码
void friendFunction(MyClass& obj) {
    std::cout << "Private data: " << obj.privateData << std::endl;
}
cpp 复制代码
friend ostream& operator(ostream& out, const Date d);
friend istream& operator(istream& in, Date d);
//Date类中private私有化导致类外不能访问这时候可以使用友元函数来进行访问。

三、友元函数的注意事项

  1. 友元关系是单向的:如果函数 A 是类 B 的友元函数,那么函数 A 可以访问类 B 的私有成员,但类 B 不能访问函数 A 的私有成员。
  2. 友元关系不能传递:如果函数 A 是类 B 的友元函数,函数 B 是类 C 的友元函数,那么函数 A 不能直接访问类 C 的私有成员。
  3. 友元函数可能破坏类的封装性:使用友元函数时,需要谨慎考虑,确保不会破坏类的封装性。如果过多地使用友元函数,可能会导致类的内部实现细节暴露给外部,从而降低程序的可维护性和可扩展性。

1.3const成员函数

一、const 成员函数的作用

  1. 保证对象的状态不被修改:通过使用 const 成员函数,可以向编译器保证该函数不会修改对象的状态。这对于那些只需要读取对象数据而不需要修改对象的操作非常有用。
  2. 允许 const 对象调用成员函数:如果一个对象被声明为 const,那么只能调用该对象的 const 成员函数。这是因为非 const 成员函数可能会修改对象的状态,而 const 对象不允许被修改。

二、const 成员函数的声明和定义

**1.**声明 const 成员函数:在成员函数的声明后面加上 const 关键字,表示该函数是 const 成员函数。

cpp 复制代码
void Date::Print()const
{
	cout << _year << "_" << _month << "_" << _day << endl;
}
//不是成员函数都可以const

1.4初始化列表

在 C++ 中,初始化列表是一种用于初始化类成员变量的语法结构。它通常在构造函数的参数列表之后,函数体之前使用。

一、初始化列表的作用

  1. 更高效的初始化:对于一些没有默认构造函数的成员变量或者需要特定参数进行初始化的成员变量,使用初始化列表可以直接调用其合适的构造函数进行初始化,避免了先使用默认构造函数初始化再赋值的过程,从而提高了程序的效率。
  2. 常量成员变量的初始化:对于常量成员变量,只能通过初始化列表进行初始化,因为常量在初始化后不能被修改。
  3. 引用成员变量的初始化:引用成员变量也必须在初始化列表中进行初始化,因为引用在声明时必须被初始化。
cpp 复制代码
class ClassName 
{
    MuQueue(int n = 20):_pushst(n),_popst(n),_size(0),_x=1;
};

private:
stack _Pushst;
stack _Popst;
int _size;
const int _x;

//成员变量的初始化顺序是声明的次序和初始化中的无关。
//实践中最好使用初始化列表。
相关推荐
咖啡教室1 小时前
java日常开发笔记和开发问题记录
java
咖啡教室1 小时前
java练习项目记录笔记
java
鱼樱前端2 小时前
maven的基础安装和使用--mac/window版本
java·后端
RainbowSea2 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea2 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
李少兄4 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝4 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖4 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
懒羊羊大王&4 小时前
模版进阶(沉淀中)
c++
s9123601014 小时前
rust 同时处理多个异步任务
java·数据库·rust