从入门到了解C++系列-----类与对象(上)

        本篇文章先初步的简单的了解类与对象,预计会有三篇文章熟悉类与对象。 

1. 初识class类

1.1引入

   c语言是面向过程的程序,c++是面向对象的。将一个任务的完成划分为几个对象。而我们c++里面的类跟c语言里面的struct的区别不仅仅在于可以定义函数,还有默认访问权限的不同。class里面的对象是默认private(这个后面我们会详细的解释),struct里定义的对象是public。

1.2 使用

 1.2.1 类的定义

    简单来说,classname就是这个类的名字。类里面包括了成员函数跟成员变量。 类的后面一定是有一个分号。

class classname
{
   //成员函数+成员变量
};//注意这个后面一定是需要一个分号

 接下来几个例子,定义的话也有两种定义方法:一种为在声明跟定义在类内,另一种为声明放在一个文件,定义放在另外一个文件(一般情况下,多使用这种方法。为了写代码方便所以我只用了第一种方法)。大家也可以着重的注意下我的命名方式。如下面的代码所示就进行了简单的定义

class Date
{
private:
void Init(int year,int month,int day)
{ 
  _day = day;
  _year = year;
  _day = day;
}
public:
  int _day;
  int _month;
  int _year;
}

1.2.2  类的访问限定符

    private:私有,public:公有,protected:受保护的。private 跟 protected 在这里先不做过多的区分。私有的访问限定符会可以封装成员变量,使外界不能访问到成员变量。这里的封装、继承、多态就构成了面向对象的三大特性(面试题常考)。

1.2.3 类的作用域

    当我们定义了一个类,就会产生一个新的类作用域,当我们想要使用这个作用域里面的函数、成员变量的时候需要通过类的作用域运算符来实现为 :: 。(常运用在类外定义类内函数)

class Date 
{
public:
	void Init(int year, int month, int day);
private:
	int _day;
	int _month;
	int _year;
};
void Date::Init(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}

1.2.4 类的实例化

    说了这么长时间的类的定义,那我们该怎么去使用类呢?想要在main函数里面去使用class,就需要对类进行实例化。所谓的实例化,就是将图纸转化为实际的建筑。

int main()
{
	Date a;//这就是对a进行实例化。
	return 0;
}

2. 类对象

2.1 计算类的大小 

     当我们实例化完成a,我们可能会产生思考,在之前的c语言中使用的结构体,采用内存对齐的规则可以计算出大小,那么在class类里面的有函数又有成员变量。那么class:a所占的字节数时多少?我们该如何计算?这个问题我们先不着急回答,我们先猜想一下,类里面成员函数是存放在什么位置?知道了成员函数的位置是不是就可以计算出,整个类所占的字节个数?我们接着往下看。

2.2 成员函数的存放

    通过对于这串代码运行与思考,可以得出如下结论:1.计算class的大小的话知识计算定义的变量的大小,特殊的对于与空类,内存会给一个字节的内存。2.成员函数存放在公共区域,不同的实例化类对象,虽然成员变量不同,但是都调用同一个成员函数

    这里的所占的字节个数,与结构体的内存对其规则相同

class Data1
{
public:
	void f1();
private:
	int _a;
};
class Data2
{
public:
	void f2();
};
class Data3
{

};
int main()
{
	cout << "1:" << sizeof(Data1) << " 2:" << sizeof(Data2) << " 3:" << sizeof(Data3) << endl;
}

3. this指针

    3.1 是什么 

      this指针对于类来说是很重要的!!!明白了这个指针是怎么工作的可以很好的理解类里面的各种默认函数是如何实现的。

      this指针是编译器自带的,默认给出的。他在调用成员函数时,将实例化对象的地址通过this指针传递给类的函数。使函数明白传递的是哪一个实例化类的变量,也就是说明白了是d1还是d2去调用对应的成员函数。

     其次this指针具有三个特性:1.是一个隐含的指针,不需要用户传递,如果写上Date* this,编译器会报错,直接使用即可。

2.是 const 类型不能够在成员函数中给 this 指针赋值。

3.this 指针的本质是“成员函数的形参”,在调用函数时将对象的地址作为实参传递给成员函数。对象中不存储 this 指针。

 

 3.2 使用

    由于是编译器,自动生成的我们无法去改变。我们来看几道题,加深一下对于this指针的使用。同时具有以下的两点特点。

1.this 指针不可以为空。2.this指针存放在栈上(在vs上会进行优化,可能存放在eox寄存器上,这个了解即可);

 例题1:里面没有调用 this 指针,因此可以正常运行。

// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
	void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Print();
	return 0;
}

例题2:运行结构如图所示,没有问题但是运行崩溃,使用了野指针。这里的崩溃不是在调用的函数的时候,因为函数没有存在类里面,所以不是在这里产生了崩溃。

 //2.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->PrintA();
	return 0;
}

 

4.结尾 

   如果对你有帮助还请帮我点个免费的赞,支持一下我,我也会不断地改进争取写出跟高质量的文章。我们共同努力!!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值