类和对象
关键字:class
类名:首字母大写,最好能体现类的功能
目的不同,类抽象出的信息不同
封装是一种选择性的暴露,把繁琐的细节隐藏,暴露给用户关心的部分。
访问限定符
public:
private:
protected:
类的实例化
栈实例化
堆实例化(申请内存时需要判断指针是否为空,释放内存时需要设空指针)
class Dog{
public:
void run();
void bark();
private:
string name;
int age;
};
Dog A;
A.name = "Tony";
A.run();
Dog *p = new Dog[5];
if(NULL == p){
return 0;
}
p[0]->name = "Bob";
p[0]->run();
delete []p;
p = NULL;
字符串类型string
1、四种初始化方式
#include <string>
int main(){
string s1;
string s2("abc");
string s3 = s2;
string s3(2, s2);
return 0;
}
2、string的常用操作![string的常用操作](https://img-blog.csdnimg.cn/20210402151200706.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FBQUFBQUFBQUFBTg==,size_16,color_FFFFFF,t_70)
string s = "hello" + "world";//编译错误
ps.两个单纯的字符串不能使用“+”相连,只允许string类型字符串+“字符串”。
数据的封装
限制参数、防止数据被修改,起保护作用
类内定义与内联函数
类内定义:数据成员、成员函数在类的内部。
内联函数:编译时将函数体代码和实参代替函数调用语句,减少调用和返回步骤,提高效率。
类内定义的成员函数优先编译为内联函数。
类外定义
同文件
分文件(正规写法,诸多好处)
构造函数
1、对象初始化方式:
1)有且仅有一次;2)根据条件初始化
作用:避免初始化函数误操作。
2、构造函数规则与特点
在对象实例化时自动调用
与类同名
没有返回值
可以有多个重载,但实例化对象时仅调用一个
没有定义时自动生成
无参构造函数 有参构造函数 (可以有默认值)
3、默认构造函数
实例化对象时不需要参数
可以没有默认构造函数,使用其他构造函数初始化
4、初始化列表特性
先于构造函数执行
只能用于构造函数
可以同时初始化多个数据成员
优点:速度快,效率高
初始化列表的必要性:类中的const修饰的数据成员不能被赋值,只能用过初始化列表。
5、拷贝构造函数
Student(const Student &stu);
参数确定,不能重载
没有自定义时系统自动生成
对象采用直接初始化(Student stu2(stu1))或复制初始化(Student stu3 = stu1)时自动调用拷贝构造函数
6、虚构函数
不允许有参数,不能重载
没用自定义时系统自动生成
对象销毁时自动调用,归还资源
class Student{
public:
Student();
Student(string _name, int _age, int _min):m_strName = _name, m_iAge = _age, m_iMin(_min){
cout << "Student(string _name, int _age, int _min)" << endl;
}
~Student();
void setname(string _name){
m_strName = _name;
}
string getname(){
return m_strName;
}
void initScore(){
m_iScore = 0;//若不初始化,m_iScore则随机
}
void study(int _score){
m_iScore += _score;
}
int getscore(){
return m_iScore;
}
private:
string m_strName;//方便识别类中的数据成员
int m_iScore;
const int m_iMin;
}