一、概念
c++是面向对象的编程语言,面相对象的意思就是在解决问题的过程中,注重在解决问题的过程中把事情拆分成不同的对象,通过对象之间的交互完成的
二、类
c++中的类是指class,struct在c++中也升级成了类
在类中可以有成员变量,成员函数,通过访问限定符保护成员变量
int main()
{
class MyClass//定义一个类,类名为MyClsaa
{
public://公有访问限定符后面的的属于公用,直到遇到下一个访问限定符
MyClass()//初始化语句
{
i = 10;
c = 'm';
}
void print()//成员函数
{
cout << i << endl << c << endl;
}
private://后面属于私有,无法通过创建的对象直接访问
int i;
char c;
};
MyClass c;//创建实例化对象c
c.print();//调用成员函数
return 0;
}
1.构建函数与析构函数
关于实例化对象的初始化,c++会在创建实例化对象的时候自动调用构建函数(初始化对象函数),
这个构建函数要求无返回值,且名字要和类名一致。如果用户没有定义这个函数则会自动生成一个构建函数(自动生成的构建函数不会初始化自带类型变量,会初始化自定义类型)
class MyClass//
{
public:
MyClass()
{
}
void print()
{
cout << i << endl << c << endl;
}
private:
int i=10;//可以在声明的时候给缺省值
char c=‘m‘;
};
你也可以创建构建函数的重载函数
class MyClass//
{
public:
MyClass()
{
i=10;
c='m';
}
MyClass(int _i,char _c)//与上面的构成重载函数
{
i=_i;
c=_c;
}
void print()
{
cout << i << endl << c << endl;
}
private:
int i;
char c;
};
int main()
{
MyClsaa ca(10,'k');//传值初始化
}
析构函数,就是释放对象变量课件的函数,当对象生命周期结束的时候,c++会自动调用,当用户没有定义这个函数的时候会自动生成,析构函数的函数名在类名之前加一个~,要求无返回值
2.类的空间占用
类的空间计算方法与结构体类似,其中的成员函数存储在栈区,不存储在对象中
3.类中的this指针
class MyClass//
{
public:
MyClass()
{
i=10;
c='m';
}
MyClass(int _i,char _c)//与上面的构成重载函数
{
i=_i;
c=_c;
}
void print()
{
cout << i << endl << c << endl;
}
private:
int i;
char c;
};
int main()
{
MyCalss mc(10,'k');
mc.printf();
}
我们在调用mc.print的时候为什么能够准确的打印出10和k,c++给每个非静态的成员函数引入一个this执政,让成员函数指向该对象,ptint中访问i和c的操作都是通过this指针实现的
void print(MyClass*this)
{
cout << this->i << endl << this->c << endl;
}
在编译器眼中这段代码的样子
class MyClass//
{
public:
void print()
{
cout <<"print"<< endl;
}
private:
int i;
char c;
};
int main()
{
Myclass*p=nullptr;
p.print;
}
以上代码运行不会出问题,因为,成员函数不是存储在对象中,print函数也没有对this函数解引用,所以不会报错
class MyClass//
{
public:
void print()
{
cout <<i<< endl;
}
private:
int i;
char c;
};
int main()
{
Myclass*p=nullptr;
p.print;
}
而这段代码在运行的时候会奔溃,因为print函数对空指针进行了解引用