类和对象
1. 类的引入
在c++中,可以用struct来定义结构体,一般情况下,都使用class。在c语言中,结构体里只能定义变量,在c++中,结构体里既可以定义变量,也可以定义函数。
class Student
{
public:
void student(const char* name,const char* number,int age,const char* sex)
{
strcpy(_name, name);
strcpy(_number, number);
strcpy(_sex, sex);
_age = age;
}
void show()
{
cout << _name << "," << _number << "," << _sex << "," << _age << endl;
}
private:
char _name[20];
char _number[20];
int _age;
char _sex[5];
};
int main()
{
Student me;
me.student("xxxx","1xxxxx",18,"女");
me.show();
system("pause");
return 0;
}
2.类的定义
Class className {
//由成员函数和成员变量构成
};
3.类的声明和定义
主要分为两种方式:
1. 类的声明和定义一般都放在类内完成
class Person
{
public:
void PrintPersonInfo();
private:
char _name;
char _sex;
int _age;
};
2. 把声明放在.h里完成,定义放在.cpp里完成
person.h
class Person
{
public:
void PrintPersonInfo();
private:
char _name;
};
person.cpp
#include “person.h”
void Person::PrintPersonInfo()
{
cout << _name << endl;
}
4.访问限定符及封装
4.1访问限定符
C++的封装性:用类将对象的属性和方法结合起来,通过访问权限选择性的将一些接口开放给用户使用
访问限定符的说明:
- public是公有的,修饰的成员在类外可以直接被访问;
- private和protected修饰的成员再类外部不可以被访问;
- 访问权限的作用域从访问限定符出现开始到下一个访问限定符开始结束。
- Class里的成员访问限定符为private,struct为public;(这也是class和struct的区别)
4.2封装性
封装性:将数据和操作数据的方法有机地结合起来,隐藏对象的属性和一些细节,仅对外公开接口和对象进行交互。
5.类的作用域
在类外定义成员时,需要加**:: **指名成员属于哪一个类.
class Person
{
public:
void PrintPersonInfo();
private:
char _name;
};
void Person::PrintPersonInfo()
{
cout << _name <<endl;
}
6.类的实例化
在对类进行调用时,要对其进行实例化。
int main()
{
Person man;
Man._name;
};
7.类对象模型
7.1如何计算类的大小
一个类中有成员函数和成员变量,那么一个类中是如何存储?
#include<iostream>
using namespace std;
//类中既有成员变量,又有成员函数
class A1
{ public:
void f1()
{}
private:
int _a;
};
// 类中仅有成员函数
class A2
{ public:
void f2()
{}
};
// 空类
class A3
{};
int main()
{
A1 a;
A2 b;
A3 c;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
}
sizeof(a)=4;sizeof(b)=1;sizeof (c )=1;
由此可以看出:类的大小是由类的成员变量之和决定,注意要使用内存对齐(内存对齐浪费空间,但是可以提高效率),空类占用一个字节;
8. this指针的特性
- this指针的类型:类类型* const
- 只能在“成员函数”的内部使用
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
- this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
void Date(Date* this)
{
Cout<<this->_year<<endl;
}
那么问题来了:This指针存放在哪里,可不可以为空呢?
This指针参数存放在寄存器中。
它可以为空,当我们调用函数时,如果函数内部并不需要使用到this,也就是不需要通过this指向当前对象并对其进行操作时才可以为空;如果调用的函数需要指向当前对象并对其进行操作,则会发生错误。