C++ 类和对象(一)

C++面向对象编程基础讲解

目录

1.面向过程和面向对象初步认识

2.类的引入

3.类的定义

4.类的访问限定符及封装

4.1类的访问限定符

4.2封装

5.类的作用域

6.类的实例化


1.面向过程和面向对象初步认识

面对过程的语言最为典型的就是C语言等

面对对象的语言典型的有C++、java、python等

那么什么是面对过程和面对对象,他们之间又有什么区别?

面对过程:关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

面对对象:基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

举例:做一份西红柿炒蛋

面对过程:我需要先切好西红柿,起锅加油,倒入西红柿,加鸡蛋,调味,煮熟,盛出。

面对对象:我需要做一份西红柿炒蛋,对象有锅、西红柿、鸡蛋,对于西红柿我需要先洗好切好,对于锅我需要起锅倒油。在整个过程中,锅不需要管西红柿和鸡蛋是什么状态,只需要关注自己,西红柿,鸡蛋也是!

2.类的引入

C语言的结构体成员是成员变量;

struct Date
{
    int year;
    int month;
    int day;
};

 对于C++ 新增了一个关键字 class(类) 与C语言的 struct 最明显的区别就是 类 不仅可以有成员变量,也可以有成员函数。.

#include<iostream>
using namespace std;
class Date

{
	int GetMonthDay(int year, int month) {
		static int GetMonDayArr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) {
			return 29;
		}
		return GetMonDayArr[month];
	}

	Date(int year = 1900, int month = 1, int day = 1) 
		
	{
		_year = year;
		_month = month;
		_day = day;
		++N;
	}

	void print() 
	{
		cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
	}
	
	static int  GetN() {
		return N;
	}
private:

	int _year;

	int _month;

	int _day;

	static int N;
};


显而易见:上面的Date类的成员有四个成员变量和四个成员函数

在C++中的class大部分情况下可以用struct进行替换但是大多数情况下依旧使用class进行类的定义。如何定义,看下一小节!

3.类的定义

class className //类名
{
    // 类体:由成员函数和成员变量组成

};  // 一定要注意后面的分号

类的构成:

class是关键字,classname是类名,{ }中定义成员函数和成员变量,切记不要忘记在{}后面还有一个分号 ;

 我们定义一个日期类作为示范

#include<iostream>
using namespace std;
class Date

{
	
	void print()
	{
		cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
	}

private:

	int _year;

	int _month;

	int _day;
};


 上述情况是将成员函数在类中定义时直接写出,我们也可以将定义和声明分离

#include<iostream>
using namespace std;
class Date

{
	
	void print();
	
private:

	int _year;

	int _month;

	int _day;
};


void Date::print()
{
	cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
}

需要注意的点是,在类外定义需要在函数返回值后,在函数名前加上 是在哪个类上的成员函数,也就是加上 Date::  

成员变量的命名规则:

1.需要注意的另外一个点是,为了避免成员变量和成员函数中的形参重名,在C++中一般在成员变量前加一个下划线,带有下划线表示是成员变量,例如上面的代码中_year,_month,_day;

2.如果成员变量和成员函数的形参依旧重合了就需要使用this指针 通过 this._year 表示是成员变量(一般Java中常用,C++中常用下划线作为成语变量的标志)

4.类的访问限定符及封装

4.1类的访问限定符

访问限定符有:public、protected、private三种 对应的访问权限如下。

public : 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问
protected : 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问
private :只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问。

现阶段的对于访问限定符不能做到完全理解所以可以简要的理解为

public是在类外也可以访问和修改 privated不可以在类外进行访问和修改

protected是被保护的类型 不可以在类外随意的修改和访问,只有特定的情况可以进行访问和修改

其次,如果不加访问限定符,规则:class的默认访问权限为private,struct为public

一个访问限定符的作用域则为,这个访问限定符的:冒号开始到下一个访问限定符的出现为止,之间的成员都受到这个访问限定符的控制

4.2封装

现阶段初步了解封装的概念,

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互(主要体现在访问限定符上的作用,让能看见的看见,让不能对别人公开的隐藏)

5.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

#include<iostream>
using namespace std;
class Date

{
	
	void print();
	
    void printed()
    {
        cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
    }
private:

	int _year;

	int _month;

	int _day;
};


void Date::print()
{
	cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
}

6.类的实例化

我们可以初步理解”类“是一个模型,例如要得到一个水杯,我们就需要水杯模型,这个模型就叫做类,通过这个模型造出来的水杯,就是这个模型的实例化对象。

#include<iostream>
using namespace std;
class Date

{
public:
	void print();
	
    void printed()
    {
        cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
    }
private:

	int _year;

	int _month;

	int _day;
};


void Date::print()
{
	cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
}

int main()
{
    Date d;
}

 Date d;  类名 类对象名。

这样我们就实例化对象了一个d,这个d中有三个成员变量和两个成员函数

访问d的成员则需要用到 . 来进行访问,但是三个成员变量受到privated的影响所以不能访问,两个成员函数可以被访问 举例如下:

#include<iostream>
using namespace std;
class Date

{
public:
	void print();
	
    void printed()
    {
        cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
    }
private:

	int _year;

	int _month;

	int _day;
};


void Date::print()
{
	cout << "年:" << _year << "     月:" << _month << "     日" << _day << endl;
}

int main()
{
    Date d;

    d.print();

    d.printed();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值