前言
C语言是面向过程的,注重的是过程,分析解决问题的步骤,之后调用函数解决问题;
C++是面向对象的,注重的是对象,将一个问题分成不同对象,靠对象之间的交互解决问题。
1. 类的引入
C语言中,结构体只能定义变量,在C++中,结构体不仅可以定义变量,也可以定义函数。
struct Teacher
{
void SetTeacherInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintTeacherInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
char _name[20];
char _gender[10];
int _age; //前面的_用来标识成员变量,可以写可以不写。
};
int main()
{
Teacher s;
s.SetTeacherInfo("Peter", "男", 38);
return 0;
}
//在C++中,struct也可以用class来代替
2. 类的定义
class className
{
// 类体:由成员函数和成员变量组成
}; // 后面的分号
//class为定义类的关键字,ClassName为类的名字,{}中为类的主体,
注意类定义结束时后面分号。类中的元素称为类的成员:类中的数据称
为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
如果成员函数在类中定义,编译器可能会将它当成内联函数处理;可以将声明放到.h头文件,类的定义实现放到.cpp文件中。
//声明放到Teacher.h中
struct Teacher
{
void SetTeacherInfo(const char* name, const char* gender, int age);
void PrintTeacherInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
char _name[20];
char _gender[10];
int _age; //前面的_用来标识成员变量,可以写可以不写。
};
#include "Teacher.h"
void Teacher::SetTeacherInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
//要加上作用域
对于函数短小的可以在类中定义,函数比较长存在递归的,要在类外中定义 。并且在类内定义只是有可能被编译器当成内联函数编译,不一定会被当成内联函数编译。
3. 封装
3.1 访问限定符
3.2 封装
在C语言中,数据和函数是分隔开的,数据被存到结构体中,函数在外面,这样的自由度很大,很容易会使代码出现问题。所以在C++中,将数据和方法封装到类中,更具有规范性和低耦合性。
class Person
{
public:
void PrintPersonInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
private:
char _name[20];
char _gender[3];
int _age;
};
//设计成可以自由访问的就用public,不想给外界访问的就设置成private
//一般成员变量都是私有或者保护的,
封装就是更严格的管理设计。
4. 类的作用域
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
5. 实例化
class Person
{
public:
void PrintPersonInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
private:
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Person p;//实例化
return 0;
}
5.2 类对象
一个类中包含了成员变量和成员函数,那么一个类的对象中都包含了什么,如果它和类一样,包含变量和函数的地址,如果实例化很多对象,就要调用很多次函数;或者说一个类的对象中只有变量,函数被存到了公共代码区,每次创建对象调用函数时到代码区调用呢?
可以得到结论,一个类的大小,实际就是该类中”成员变量”之和(满足结构体内存对齐规则),注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。而函数是被放到了操作系统中的公共函数区。
不清楚内存对齐规则的铁子们,可以看我之前C语言中关于结构体的内存对齐规则的一篇博客,在C++中的结构体和类的对象都是符合这个规则的:C语言--解析结构体__w_z_j_的博客-CSDN博客
6. this指针
class Person
{
public:
void PrintPersonInfo()
{
cout << _name << " "<<_gender << " " << _age << endl;
}
public:
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Person p1;
p1._name;
p1.PrintPersonInfo();
Person p2;
p2._name;
p2.PrintPersonInfo();
return 0;
}
void PrintPersonInfo()
{
cout << _name << " "<<_gender << " " << _age << endl;
}
//经过编译器处理成员函数后
void PrintPersonInfo(Person* this)
{
cout <<this-> _name << " "<<this->_gender << " " << this->_age << endl;
}
1.this指针存在哪里?
其实编译器在生成程序时加入了获取对象首地址的相关代码。并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同)。也就是成员函数的其它参数正常都是存放在栈中。而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。
2.this指针可以为空吗?
可以为空,当我们在调用函数的时候,如果函数内部并不需要使用到this,也就是不需要通过this指向当前对象并对其进行操作时才可以为空(当我们在其中什么都不放或者在里面随便打印一个字符串),如果调用的函数需要指向当前对象,并进行操作,则会发生错误(空指针引用)就跟C中一样不能进行空指针的引用。