C++学习笔记——面向对象高级开发

C++学习笔记——面向对象高级开发

P2 转换函数 conversion function

class Fraction{
public:
	// 转换函数,不需要写返回值类型,编译器自动补充;不一定是基本类型
	operator double() const{ 
		return (double)(m_numerator/m_denominator);
	}
private:
	int m_numerator;//分子
	int  m_denominator;//分母
};

Fraction f(3,5);
double d = 4+f; // 调用operator double()将f转为double

P3 non-explicit-one-argument constructor

class Fraction{
public:
	Fraction(int num,int den=1):m_numerator(num),m_denomiator(den){}//1
	operator double() const;//2
	explicit Fraction(int num,int den=1):m_numerator(num),m_denomiator(den){}//3;explicit避免隐式调用
	Fraction operator+(const Fraction& f){
		return ...;
	}
	
private:
	int m_numerator;//分子
	int  m_denominator;//分母
};

Fraction f(3,5);
Fraction d2 = f+4;;//如果只定义了1,则调用了non-explicit构造函数讲4转为Fraction,然后调用+;同时定义1、2时会有二义性,编译报错;同时定义2、3会报错,不会调用3

P4 pointer-like classes,行为像指针的类

  • 智能指针
template<class T>
class share_ptr{
public:
	T& operator*()const{return *px;}
	T* operator->()const{return px;}
	shared_ptr(T* p):px(p){}//接收一个天然指针
private:
	T* px;
	long* pn;
};

struct Foo{
	...
	void method(void){...}
};

shared_ptr<Foo> sp(new Foo);
Foo f(*sp);//解参考
sp->method();//px->method(); ->有传递性
  • 迭代器:定义了++、–、*、->、==、!=等操作符

P5 function-like classes,行为像函数,仿函数

  • 仿函数:重载了操作符()的类

P6 namespace经验谈

  • namespace:避免命名冲突

P7 class template,类模板

P8 function template,函数模板

P9 member template,成员模板

template<class T1,class T2>
struct pair{
	T1 first;
	T2 second;
	pair():first(T1()),second(T2()){}
	pair(const T1& a,const T2& b):first(a),second(b){}
	//成员模板
	template<class U1,class U2>
	pair(const pair<U1,U2>& p):first(p.first),second(p.second){}
};

P10 specialization,特化

template <class K> struct hash{};//泛化
template<> struct hash<char>{//特化
	size_t operator()(char x) const {return x;}
}

template<> struct hash<int>{//特化
	size_t operator()(int x) const {return x;}
}

P11 partial specialization模板偏特化

  • 个数上的偏
template<typename T,typename Alloc=...>
class vector{
...
};
//偏特化
template<typename Alloc=...>
class vector<bool,Alloc>{
...
};
  • 范围上的偏
template<typename T>
class C{
...
};
// 范围限定到指针的偏特化
template<typename T>
class C<T*>{
...
};

P12 template template parameter,模板模板参数

template<typename T,
		template<typename T> class SmartPtr//模板模板参数
		>
class XCls{
private:
	SmartPtr<T> sp;//!!!
public:
	XCls():sp(new T){}
};
XCls<string,shared_ptr> p1;
XCls<double, unique_ptr> p2;//错误
XCls<int, week_ptr> p3;//错误
XCls<long, auto_ptr> p4;

P13 关于C++标准库

  • 容器,迭代器,算法,仿函数

P14 三个主题

  • 数量不定的模板参数
void print(){}

template<typename T,typename... Types>
void print(const T& firstArg, const Types&... args){
	cout<<firstArg<<endl;
	print(args...);
	//sizeof(args)是参数个数
}
  • auto:编译器自动推断类型
  • range-based for
vector<double> vec;
...
for(auto e:vec){
	cout<<e<<endl;
	e *= 4;//值传递,不改变原始数组
}

for (auto& e:vec){
	e *= 3;//引用传递,会改变原始数组
}

P15 引用

int x = 0;
int* p = &x;//指针
int& r = x;//引用

void func1(Cls* pobj);
void func2(Cls obj);
void func3(Cls& obj);

//以下两个函数不能共存,same signature;调用方法一样,如果能共存就不知道调用哪个函数
void func(const int  a);
void func(const int& a);

void func(const int a) const;//const是函数签名的一部分,与以上两个函数能共存

P16 复合&继承关系下的构造和析构

  • 继承:构造由内到外,析构由外到内
  • 组合+继承:先构造父类,再构造组合

P17关于vptr和vtbl,虚指针、虚表

  • 有虚函数的类就会多一个虚函数指针
  • 动态绑定,多态
  • 三个条件:指针调用,向上转型,调用虚函数
    虚指针、虚函数表

P18 关于this

  • this指向的是子类对象

P19 对象模型:关于动态绑定

动态绑定

P20 关于 new,delete

  • new:先分配内存,再调用构造函数
  • delete:先调用析构函数,再释放内存

P21 重载new,delete

//全局
inline void* operator new(size_t size);
inline void* operator new[](size_t size);
inline void* operator delete(size_t size);
inline void* operator delete[](size_t size);
//成员
class Foo{
public:
	void* operator new(size_t);
	void operator delete(void*,size_t);//size_t是可选的
};

P22 示例

P23重载new(),delete()示例

P24 basic_string试用new(extra)扩充申请量

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象的编程中,C语言并不直接支持类和抽象的概念。引用中提到,final关键字用来修饰方法,表示该方法不能在子类中被覆盖。而abstract关键字用来修饰抽象方法,表示该方法必须在子类中被实现。然而,在C语言中,没有对应的关键字来实现类和抽象的概念。 相反,C语言通过结构体来模拟类的概念。结构体是一种用户自定义的数据类型,可以包含多个不同类型的数据成员。通过结构体,我们可以将相关的数据和功能组合在一起。然而,C语言中的结构体不支持继承和多态等面向对象的特性。 在C语言中,我们可以使用函数指针来模拟抽象类和接口的概念。函数指针可以指向不同的函数,通过使用函数指针,我们可以实现多态性,即在运行时根据函数指针指向的具体函数来执行不同的操作。 综上所述,C语言并不直接支持面向对象中的类和抽象的概念,但可以使用结构体和函数指针来实现类似的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [面向对象——类和对象](https://blog.csdn.net/shouyeren_st/article/details/126210622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [面向对象编程原则(06)——依赖倒转原则](https://blog.csdn.net/lfdfhl/article/details/126673771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值