侯捷C++大系 -- C++面向对象高级编程(上)

本文介绍了C++中面向对象编程的深入概念,包括无指针成员和指针成员的类设计,以及深拷贝和浅拷贝的区别。讨论了拷贝构造函数、拷贝赋值函数和析构函数的重要性,特别是当类中含有指针成员时。同时阐述了C++的OOP/OOD原则,如继承、组合和委托,并强调了在涉及指针时自定义这三个特殊函数的必要性。
摘要由CSDN通过智能技术生成


#C++面向对象程序设计

class without pointer members

基于对象(Object Based):单个class的设计;C++中classes的两个经典的分类:

  • class without pointer members
    • 可以使用默认的拷贝构造函数和拷贝赋值函数
    • 默认的拷贝构造函数和拷贝赋值函数由编译器根据需要自动生成,执行浅拷贝
    • 不带指针的类多半不需要析构函数
  • class with pointer members
    • 最好是自定义拷贝构造函数和拷贝赋值函数,自定义实现深拷贝
    • 一般需要析构函数

面向对象(Object Oriented):多重 classes 的设计,classes和classes之间的关系;classes之间的关系有:

  • 继承(inheritance)
  • 组合(composition)
  • 委托(delegation)

C++历史:

B语言(1969)-> C语言(1972)-> (new C -> C with Class -> C++(1983))

C++演化:
C++ 98(1.0)-> C++ 03(TR1)-> C++ 11(2.0)-> C++ 14

C++包括两部分:C++语言和C++标准库

inline函数:inline是C++编译器提供的一种特性。在函数前面加 inline 关键字,只是对编译器的建议,告诉编译器,你尽量帮我inline,最终是否inline,由编译器决定,对于太复杂的程序,编译器可能没能力将其变成inline。

  • 函数太复杂,无法inline
  • 函数体在class中已经定义完成,便自动成为inline候选者
  • 在class中声明函数时可以先不写inline关键字,在class外部实现定义的时候再加inline也可以

friend(友元)函数:打破了 C++ 的封装的大门,类的友元函数能直接拿到该类对象的私有数据,而其他的普通函数只能通过接口访问对象的私有数据。相同class的各个 objects 互为 friends(友员)。

class complex {
   
	...

	// 相同class的各个 objects 互为 friends(友员)
	int func(const complex &param) {
   
		return param.re + param.im; // 可直接访问 私有数据
	}
	private:
		double re, im;
};

overloading(函数重载):函数名称一样,但是函数的参数个数或参数类型不一样或有无 const,与返回值类型无关。

operator overloading(操作符重载):在C++中很重要,操作符可重载为以下两种函数:

  • 成员函数
    • 任何的 non-ststic 成员函数都有一个隐藏的 this 指针
  • 非成员函数(global函数)
    • << 只能重载为非成员函数(友元或非友元都可)

一个class的成员类型:

  • data members
    • non-static data members(每个 objects 都有一份属于自己的data)
    • static data members(class所有,所有 objects 共享该data,可被 non-static 或 static member functions 或 global functions 访问或修改(如果有足够权限的话))
  • member function
    • non-static member functions(含有隐藏的 this 指针,可操作 non-static data members 和 static data members)
    • static member functions(没有this指针,只能操作 static data members)
      • 调用 static 函数的方式有二:
        • 1)通过 object 调用
        • 2)通过 class name 调用
    • const member functions(常量成员函数,不改变对象的data)
      • 在创建对象的时候,如果在class前面加 const,表示不想修改这个将要被创建出来的对象的数据,那么该对象之后的函数调用只能调用 const member functions,如果调用 non-const member functions,则会出现编译错误。

temp obbject(临时对象):typename();
临时对象没有名称,生命期到下一行就结束,标准库中应用的较多。

complex operator + (const complex &x, const complex &y) {
   
	return complex(x.real
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值