c++ 类和对象(上)

c语言到c++,必须要先知道的基础知识!请戳下面的文章链接
---------------->>>>>点我,开始入门c++

类与对象的初步认知

  • C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
  • C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

在C++中对象的类型称为类(class)。类代表了某一批对象的共性和特征,总结一句话就是:类是对象的抽象,而对象是类的具体实例
注意:类是抽象的,不占用内存,而对象是具体的,占用存储空间!

类的定义

class className
{
	// 类体:由成员函数和成员变量组成
}; 	// 一定要注意后面的分号

说明:class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:
类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。

类的两种定义方式:

  • 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器一般会将其当成内联函数处理。
  • 类声明放在.h文件中,类的定义放在.cpp文件中,包括成员函数的定义。这样可以保持接口与实现的分离的软件工程原则。

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

C语言的结构体和c++的类的本质区别:
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

类的信息隐蔽及封装性

C++通过类实现封装性:用类将对象的属性与方法封装在类中,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。。

信息隐蔽:声明类时,一般把所有的数据指定为私有的,使它们与外界隔离,把需要让外界调用的成员函数指定为公有的,达到在类外无法直接访问私有数据成员,只能调用共用成员函数来应用,实现了信息的隐蔽性。

总结起来就是:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

访问限定符说明

  1. public(公有的)修饰的成员在类外可以直接被访问
  2. protected(受保护的)和private(私有的)修饰的成员在类外不能直接被访问
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. class的默认访问权限为private,struct为public(因为C++要兼容C,保留的struct)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。

问题:C++中struct和class的区别是什么?
C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式是private。

类的对象大小

一个对象所占空间的大小这取决与该对象中数据成员所占的空间,而与成员函数无关。函数的目标代码是存储在对象空间之外的。
比如:同一个类定义了十个对象,这些对象的成员函数对应的是同一个代码段,而不是十个不同的函数代码段!

// 类中既有成员变量,又有成员函数

class A1 {
	public:
		void f1(){}
	private:
		int _a;
};//sizeof(A1)=4

// 类中仅有成员函数
class A2 {
	public:
		void f2() {}
};//sizeof(A2)=1

// 类中什么都没有---空类
class A3
{}; //sizeof(A3)=1

结论:一个类的大小,实际就是该类中”成员变量”所占空间之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类(占位)。
需要说明:
(1)不论成员函数在类内定义还是在类外定义,成员函数的代码段的存储方式是相
同的,都不占用对象的存储空间不要误以为在类内定义的成员函数的代码段占用对象
的存储空间,而在类外定义的成员函数的代码段不占用对象的存储空间。
(2)不要将成员函数的这种存储方式和inline(内置)函数的概念混淆。不要误以为
用inline声明(或默认为inline )的成员函数,其代码段占用对象的存储空间,而不用inline
声明的成员函数,其代码段不占用对象的存储空间。不论是否用inline声明,成员函数的代码段都不占用对象的存储空间。用inline声明的作用是在调用该函数时,将函数的代码段复制插入到函数调用点,而若不用inlie声明,在调用该函数时,流程转去函数代码段的入口地址,在执行完该函数代码段后,流程返回函数调用点。inline 函数只影响程序的执行效率,而与成员函数是否占用对象的存储空间无关,它们不属于同一范畴,不应搞混。

类成员函数的this指针

class Date
{
public :
	void Display ()
	{
		cout <<_year<< "-" <<_month << "-"<< _day <<endl;
	}
	void SetDate(int year , int month , int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private :
	int _year ; // 年
	int _month ; // 月
	int _day ; // 日
};
int main()
{
	Date d1, d2;
	d1.SetDate(2020,3,28);
	d2.SetDate(2018,3,27);
	d1.Display();
	d2.Display();
	return 0;
}

问题:Date类中有SetDate与Display两个成员函数,不同的对象使用的是同一个函数代码段,它怎么能够区分对不同对象中的数据进行操作呢?函数体中没有关于不同对象的区分,那当s1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置s2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

this指针的特性

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参(存在栈上),一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
发布了55 篇原创文章 · 获赞 152 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_44785014/article/details/105163109