内联函数
在类定义中直接写出函数体的的函数被认定为内联函数,较短的函数体能够提高性能,但稍长一些的函数体还是在外定义
外定义:
返回类型 类名:: 函数名
类外部访问私有数据成员的方法
set(形参)(提供外部初始化的接口)
{a=x1;
b=x2;
...}
get()(提供外面访问内部数据成员的窗口)
{return a;}
tips:输入和访问字符串
输入和访问字符串需要使用指针(字符串的样子是这样的例如:"wangwu
")
void setname(char* nameval) //设置属性(提供接口给外部进行修改)
{
strcpy(name, nameval);
}
char* getname() //对字符串的访问,需要使用指针
{
return name;
}
CPerson p1; //p1, 对象
CPerson* p = &p1 //对象指针*/
p1.set("wangwu", 19, 'm');//这行与下一行意义相同
P->set("wangwu",19,'m');
(*p).set("wangwu", 19, 'm');
p->setname("limin");
p->setage(18);
p->setsex('F');
上面是类外访问的三种方式,一种是使用对象名,还有两种是使用指向对象的指针
this指针
这个只需稍微了解一下
这个this指针是指向使用this的成员函数的对象地址的
每个成员函数都会被编译器编译一个this指针
const常量符号
这个是为了告诉阅读代码的人这个成员函数只会使用该数据成员的值而不会改变其值
这个是格式(在小括号与大括号之间)
<返回数据类型> 函数名( ) const { 函数体}
<返回数据类型> 函数名( ) const;
对象的生存期
这个与变量的生存期类似
对象的生存期概念与变量生存期概念一样,由对象声明决定。其中各个数据成员的生存期由对象生存期决定,对象存在它就存在,对象被撤消它就被撤消。
局部对象:当对象被定义时,该对象被创建,当程序退出定义该对象所在的函数体或程序块时,释放该对象。
静态对象:当程序第一次执行所定义的静态对象时,该对象被创建,当程序结束时,该对象被释放。
全局对象:当程序开始时,创建该对象,当程序结束时释放该对象
对象的初始化与其释放回收
构造函数(用来初始化数据成员)
有几点要注意:
函数名要与类名相同
若已创建了构造函数,编译器将不再自动创建无参构造函数
若定义不带参数的类对象,需要添加一个无参构造函数,空函数体
构造函数应声明为公有函数
构造函数在创建对象的时候自动调用
创建对象的时候提供相应参数便调用相应构造函数
CPerson p1(name, age, sex);
大致有三种
date();
date(char*a,int a);
CToolBooth() = default; 显式缺省,编译器使用系统默认的无参构造函数。不再需要提供空函数体。
动态对象的创建与释放
int main()
{
CPerson *s1 = new CPerson; //无参构造
CPerson *s2 = new CPerson("wangwu"); //带参构造,默认两个参数
CPerson *s3 = new CPerson("zhaoliu", 20, 'M'); //带参构造
s1->print();
s2->print();
s3->print();
delete s1;
delete s2;
delete s3;
}
参数初始化表初始化数据成员
函数首部的初始化仅限于构造函数
//函数体内对数据成员初始化
CPerson::CPerson(const char* nval, int aval, char sval)
{
strcpy(name, nval);
age = aval;
sex = sval;
}
//函数首部实现数据成员初始化
CPerson::CPerson(const char* nval, int aval, char sval):age(aval),sex(sval)
{
strcpy(name, nval);
}
析构函数是类的另一特殊成员函数,用于在对象终止时由系统自动调用,以释放分配给对象的内存。
析构函数的函数名应为类名前加“~”。
析构函数没有参数,也不能指定返回值类型。
一个类只能声明一个析构函数。
析构函数也是公有的成员函数。
析构函数定义如下,都是系统自动调用的。如果类中没有声明,则编译器会自动提供一个带空函数体的析构函数
拷贝构造函数
深拷贝与浅拷贝只需了解一点,浅拷贝两个对象的数据成员共用空间,深拷贝两个对象取的是两个不同的空间,所以类内存在指针数据需要使用深拷贝,避免指针数据被重复释放两次,导致程序报错
CPerson() = default; //缺省构造
CPerson(const char* nval, int aval = 18, char sval = 'F'); //带参构造
CPerson(const CPerson& rhs); //拷贝构造,用rhs对象初始化当前对象
//--------
CPerson::CPerson(const CPerson& rhs)
{
strcpy(name, rhs.name);
age = rhs.age;
sex = rhs.sex;
}
//--------
CPerson s1; //调无参构造
CPerson s2("wangwu"); //调带参构造,默认两个参数
CPerson s3("zhaoliu", 20, 'M'); //调带参构造
CPerson s4(s3); //调拷贝构造
CPerson s5 = s4; //调拷贝构造