c++ 类与对象(上)

一、类

在c++中,结构体不仅可以定义变量,也可以定义函数。

struct Student
{
	int _age;
	void setstudent(int age){
		_age = age;
		cout << _age << endl;
	}
};

int main()
{
	Student s;
	s.setstudent(18);
	system("pause");
	return 0;
}

但其实c++更喜欢class来代替

类的定义有两种:

 1.声明和定义在一块

class Person{
public:
	void showinfo(){
cout << _name << "-" << _sex << "-" << _age << endl;
}
public:
	char* _name;
	char* _sex;
	int _age;
};

2.声明和定义分开

#pragma once
class Person{
public:
	void showinfo();
	char* _name;
	char* _sex;
	int _age;
};
void Person::showinfo()
{
		cout << _name << "-" << _sex << "-" << _age << endl;
}

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

  类的访问限定符有:共有,保护,私有

若class没有定义限定符,默认为私有

struct为共有型,因为它要兼容C

那么我们在类外要如何访问类中的私有成员变量呢?

 我们可以通过接口来进行访问

class date{
public:	
	void set(int year = 2018, int month = 8, int data = 10){//全缺省
		_year = year;
		_month = month;
		_data = data;
	}
	void showinfo()
	{
		cout << _year << "-" << _month << "-" << _data<< endl;
	}
private:
	int _year;
	int _month;
	int _data;
};
int main()
{
	date s;
	s.set();
	s.showinfo();

什么是封装呢?

隐藏对象的属性和实现细节,金地外公开接口和对象进行交互,将数据和操作的方法进行有机结合。

5.类的作用域:

  只能通过 .  -> 的方式访问,上面用的点访问,那么我们下面是用了指针的方式进行访问

	date d;
	date *s = &d;
	s->set();
	s->showinfo();

还要说明一点:成员变量在类中具有全局性

在这里再提一个问题;

  C语言中的结构体和c++中的结构体有何不同?c++中的struct和class有何区别?

   答:C语言中的结构体只用来定义变量,而c++中的结构体可以定义函数

           c++中的struct是public型的,而class是有访问限定符的

6.类的实例化

    用类类型创建对象的过程就是类的实例化。

   1.类只是一个模型一样的东西,限定了有那些成员,定义类没有分配实际的内存空间来存储

   2. 一个类可以实例化多个对象,实例化出来的对象占实际物理空间,存储类成员变量

   7.类的大小

class a1{

};
class a2{
public:
	void f1(){
	}
	void f2(){
	}
};
class a3{
	void f1(){
	}
private:
	int _v;
};
int main()
{

	cout << sizeof(a1) << sizeof(a2) << sizeof(a3) << endl;

我们首先要知道内存是如何进行存储的,在这里,他只保存对象的具体成员变量。所有的成员函数放在统一的代码公共区。

a3是4,就是成员变量的大小,这里要注意内存对齐

那么前面两个为什么是1呢?

是因为空类比较特殊,编译器给了空类一个字节来唯一标识这个类。

8.类的this指针

class date{
public:	
	void set(int year = 2018, int month = 8, int data = 10){//全缺省
		_year = year;
		_month = month;
		_data = data;
	}
	void showinfo()
	{
		cout <<this-> _year << "-" << _month << "-" << _data<< endl;
	}
private:
	int _year;
	int _month;
	int _data;
};
int main()
{
	date a;
	a.set(2018,8,10);
	date b;
	b.set(2018, 8, 11);
	a.showinfo();
	b.showinfo();
}

我们会觉得很奇怪,我们两次附了不同的值,为什么在打印的时候竟然没有出错?打印函数并有传递参数,他是如何知道我们要打的内容。

是因为:

1.每个成员都有一个指针形参,他的名字是固定的,称为this指针,this指针是隐形的。

2.编译器在对成员函数进行处理时,在对象调用成员函数时,对象地址作为实参传递给成员函数的第一个形参this指针。

3.this指针是编译器自己处理的。我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。

那么this指针是在哪里存呢?

栈上,因为它是作为形参传给函数,那么一定会在栈上开辟空间。

猜你喜欢

转载自blog.csdn.net/Z_JUAN1/article/details/81570995