欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第十章-类和对象

程序员文章站 2022-04-25 15:19:21
...

第十章 对象和类


本文是在阅读《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];
      		...
      }
    

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

相关标签: CPP