施磊c++基础3

面向对象(OOP)

3.1 类与对象基础

OOP的四大特征是什么?
抽象 — 封装 — 继承 — 多态

类 -》 实体
访问限定符:
public (公共),private (私有),protected (保护)

对于成员属性

#include<iostream>
using namespace std;

const int NAME_LEN = 20;
class CGOODS
{
   
   
private:
	char _name[NAME_LEN];
	double _price;
	int _amount;
};
int main()
{
   
   

	CGOODS good;
	cout << good._price << endl;
	return 0;
}

报错
在这里插入图片描述
所以,属性一般都是私有的,能具有更高的安全性

而为了能访问属性,一般会提供公有的方法

public://公有的成员方法
	void init(char* name, double price, int amount);
	void show();

	void setName(char* name) {
   
    strcpy(_name, name); }
	void setPrice(double price) {
   
    _price = price; }
	void setAmount(int amount) {
   
    _amount = amount; }

	const char* getName() {
   
    return _name; }
	double getPrice() {
   
    return _price; }
	int getAmount() {
   
    return _amount; }

类体内实现的方法,自动处理成inline内联函数

而在类外定义的成员方法,则会和一般函数一样有函数调用过程


void CGOODS::init(const char* name, double price, int amount)
{
   
   
	strcpy(_name, name);
	_price = price;
	_amount = amount;
}

void CGOODS::show()
{
   
   
	cout << "name: " << _name << endl;
	cout << "price: " << _price << endl;
	cout << "amount: " << _amount << endl;

}

int main()
{
   
   

	CGOODS good1;
	//cout << good._price << endl;
	good1.init("面包", 10.0, 200);
	good1.show();
	good1.setPrice(20.5);
	good1.show();

	CGOODS good2;

	good2.init("空调", 10000,50);
	good2.show();
	return 0;
}

计算对象的内存大小,对象的内存大小只和成员变量有关。(与struct结构体相同)

类可以定义无数个对象,每一个对象都有自己的成员变量,但是共用一套成员方法。

那么成员方法怎么知道处理哪个对象的信息?
init(name,price,amount)=》怎么知道初始化哪个对象?
答:会把调用的对象的地址传进该成员方法
即,类的成员方法一经编译,所有的方法参数,都会加一个this指针,接收调用该方法的对象的地址

3.2 构造函数与析构函数

先来一个顺序栈代码

#include<iostream>
using namespace std;

class SeqStack
{
   
   

public:
	void init(int size = 10)
	{
   
   
		_pstack = new int[size];
		_top = -1;
		_size = size;
	}
	void release()
	{
   
   
		delete[]_pstack;
		_pstack = nullptr;

	}
	void push(int val)
	{
   
   
		if (full())
			resize();
		_pstack[++_top] = val;
	}
	void pop()
C++多线程编程中,施磊的代码示例提供了一个经典的“哲学家进餐问题”的实现[^1]。该问题的核心在于多个线程(代表哲学家)需要同时获取两个资源(左右两边的叉子),这可能导致死锁。施磊的实现中,通过使用`std::mutex`来模拟叉子,并在`wantsToEat`方法中使用`std::unique_lock`来确保线程安全。 以下是一个简化的C++多线程资源管理示例,适用于类似场景: ```cpp #include <iostream> #include <thread> #include <vector> #include <mutex> #include <functional> class DiningPhilosophers { public: const int n = 5; std::vector<std::unique_ptr<std::mutex>> mtxs; DiningPhilosophers() { for (int i = 0; i < n; i++) { mtxs.push_back(std::make_unique<std::mutex>()); } } void wantsToEat(int philosopher, std::function<void()> pickLeftFork, std::function<void()> pickRightFork, std::function<void()> eat, std::function<void()> putLeftFork, std::function<void()> putRightFork) { std::unique_lock<std::mutex> llock(*mtxs[philosopher]); std::unique_lock<std::mutex> rlock(*mtxs[(philosopher + n - 1) % n]); pickLeftFork(); pickRightFork(); eat(); putLeftFork(); putRightFork(); } }; int main() { DiningPhilosophers dp; auto pickLeft = [](int id) { std::cout << "Philosopher " << id << " picked up left fork.\n"; }; auto pickRight = [](int id) { std::cout << "Philosopher " << id << " picked up right fork.\n"; }; auto eat = [](int id) { std::cout << "Philosopher " << id << " is eating.\n"; }; auto putLeft = [](int id) { std::cout << "Philosopher " << id << " put down left fork.\n"; }; auto putRight = [](int id) { std::cout << "Philosopher " << id << " put down right fork.\n"; }; std::vector<std::thread> threads; for (int i = 0; i < 5; ++i) { threads.emplace_back([&dp, i]() { dp.wantsToEat(i, [&]() { pickLeft(i); }, [&]() { pickRight(i); }, [&]() { eat(i); }, [&]() { putLeft(i); }, [&]() { putRight(i); }); }); } for (auto& t : threads) { t.join(); } return 0; } ``` ### C++资源推荐 1. **书籍** - 《C++ Primer》:适合初学者和有一定经验的开发者,内容详尽。 - 《Effective Modern C++》:Scott Meyers的经典之作,深入探讨C++11/14的新特性。 - 《C++ Concurrency in Action》:Anthony Williams撰写,专注于C++并发编程。 2. **在线教程与文档** - [CppReference](https://en.cppreference.com/):权威的C++参考文档,涵盖标准库和语言特性。 - [LearnCPP](https://www.learncpp.com/):适合初学者的C++教程网站。 - [GeeksforGeeks C++](https://www.geeksforgeeks.org/c-plus-plus/):提供大量C++示例和算法实现。 3. **视频课程** - **B站**:搜索“施磊 C++”,可以找到相关的教学视频,涵盖基础语法、面向对象、STL、多线程等。 - **Coursera**:提供由大学教授讲授的C++课程,如“C++程序设计”。 - **Udemy**:有大量实战项目导向的C++课程,如“C++17 Fundamentals”。 4. **开源项目与代码库** - **GitHub**:搜索关键词“C++ 项目”或“C++ 示例”,可以找到大量开源项目,如游戏引擎、算法库、图形渲染等。 - **Boost库**:C++的扩展库,包含大量实用的模板和工具类,适合进阶学习。 5. **社区与论坛** - **Stack Overflow**:遇到具体问题时,搜索相关标签(如`c++`)可以找到解决方案。 - **Reddit的r/cpp**:活跃的C++讨论区,适合交流经验和获取最新资讯。 - **C++论坛**:一些中文技术社区(如优快云、知乎)也有专门的C++讨论区。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值