一、类
在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指针是在哪里存呢?
栈上,因为它是作为形参传给函数,那么一定会在栈上开辟空间。