第十章-类和对象

第十章 对象和类


本文是在阅读《C++primer》第六版时,对于对象和类的一些学习记录。


在这里插入图片描述

c++通过改进c使得,c++具有面向对象编程**(OOP)**的特性。所以要
区别的理解面向对象和之前在C中面向过程的不同的编程思想。

以下有一个关于类的定义

	//stock00.h --stock class interface 
	//version 00
	
	#ifndef STOCK00_H
	#define STOCK00_H
	
	#include <string>
	
	class Stock // class declaration
	{
		private:
			std::string company;
			long shares;
			double share_val;
			double total_val;
			void set_tot(){total_val = shares * shares * share_val}
			
		public:
			void acquire(const std::string & co, long n, double pr);
			void buy(long num, double price);
			boid sell(long num, double price);
			void update(double price);
			void show();
	};		// note semicolon at the end 
	
	#endif
  1. 访问控制
    关键字public和private实现。类对象的程序可以直接访问公有部分,但是只能通过公有成员函数私有部分

  2. 控制对成员的访问:公有还是私有
    不必声明关键字private,因为这是类对象的默认访问控制。

  3. 对于类中定义的的函数都自动称为inline函数,如果愿意也可以类外定义成员函数,并使其成为inline函数。确保inline函数可用的最简单的方法是,将inline定义放在定义累的头文件中

  4. 类对象有自己的存储空间用来存储内部变量和类成员;但同一个类的对象共享同一组类方法,即每个方法只有一个副本

3.类的构造函数和析构函数

特别说明,构造函数没有声明类型。

使用构造函数的方法有两种:

  • 显示调用 Stock food = Stock("world Change", 250, 1.25)
  • 隐式调用 Stock garment("Furry Mason", 50, 2.5)

一般来说,使用对象来调用函数,但是无法使用对象来调用构造方法。

当且仅当没有提供默认的构造函数的时候,编译器才提供默认的构造函数。

析构函数完成清理工作。如果创建的是静态存储对象,析构函数在程序执行完代码块时自动的调用。如果创建的是自动存储类对象,代码块结束后调用。

特别说明,在类对象进行赋值的时候,是把原来类的成员的内容覆盖。

由于自动变量是存放在栈中的,因此对象析构的顺序是先创建的对象最后删除。

员函数不修改调用对象时将const作为关键字放在函数的括号后面

	void show() const; // promise not to change invoking object
	
	void stock::show() const; // promises not to change invoking object

4.this指针

每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this.在函数的括号后面使用const限定符将this限定为const,这样讲不能使用this来修改对象的值。

要返回的并不是this,因为this是对象的地址,而对象本身身*this

5.对象数组

初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后利用提供的变量来构造一个临时对象,然后将临时对象的内容复制到相应的元素。

6.类作用域

类中定义的名称(数据成员和成员函数)的作用域属于整个类,作用域为整个类的名称只在该类中已知。

如果想创建一个由所有对象共享的类常量,目前来说有两种方法:

  • 在类中声明一个枚举

  • 使用static关键字在类中定义常量

      //使用枚举的方式
      class Bakery
      {
      	private:
      		enum{Months=12};
      		double costs[Months];
      		...
      }
      
      //使用静态变量的方式
      class Bakery
      {
      	private:
      		static const int Months = 12;
      		double costs[Months];
      		...
      }
    

关于上面提到的枚举方法,在使用时可能出现名称冲突的问题,解决的方案就是加上类的作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值