- 类的引入:
- C++中,结构体struct不仅可以定义变量,还可以定义函数
-
struct Data { int _a; void func() { cout << "hello class" << endl; } };
但是在C++z中引入了新的关键字-->class,所谓入乡随俗,所以更推荐用class定义
-
class Data { int _a; void func() { cout << "hello class" << endl; } };
但是class 和 struct又存在一些访问权限的问题,这个我们后面再谈
-
类的定义方式:
-
第一种:声明定义不分离:
class test { //先不关注这个public,下面同上 public: int func(int x,int y) { return x + y; } private: int _a; };
-
第二种:声明定义分离(推荐)
-
//.h文件 class test { public: int func(int x, int y); private: int _a; }; //.cpp文件 int test::func(int x, int y) { return x + y; }
-
类中成员变量名约定规范
-
成员变量名前+ _ 先来看看不规范和规范的场景对比
-
class test { public: void func(int a) { a = a;//容易分不清谁是谁 } private: int a; }; class test { public: void func(int a) { _a = a; } private: int _a; };
访问限定符 -
public
-
顾名思义,就是public中的成员是公有的,外界可以直接调用。
-
private
-
顾名思义,就是private中的成员是私有的,外界不能直接调用,只能在类内部调用。
-
protected
-
功能与private类似
-
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止类的作用域:类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域 。
class test { public: void func(int a); private: int _a; }; void test::func(int a) { cout << "test::func()" << endl; }
类的实例化:简单来说就是定义好一个类后,创建该类类型的对象,就是类的实例化在为实例化出对象之前,类是没有大小的。class test { public: void func(int a) { cout << "test::func()" << endl; } private: int _a; }; class fun { public: void func(int a) { cout << "test::func()" << endl; } private: int _a; float _b; }; int main() { test t1; fun f1; cout << sizeof(t1) << endl; cout << sizeof(f1) << endl; return 0; }
计算一下t1和f1的大小?
很显然,只计算了对应类的成员变量的大小,sizeof(t1)=4,sizeof(f1) = 8;
this指针:
1.C++编译器给每个“非静态(static修饰)的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)
class Student() { int fun(int x) { return x; } };
函数fun(int x)的原型在编译器看来就是 fun(Student*const this ,int x )
2.this指针只能在“成员函数”的内部使用
3.this指针本质上是“成员函数”的形参,对象中并不储存this指针!
关于this指针的常见面试题:
this指针存放在哪里?
解释:类的成员函数的其它参数正常都是存放在栈中。而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。
this指针能否为空?
解释:可以,前提是不对this指针进行访问操作。