农产品网站如何做地推,长沙点梦网站建设,网站建设可行性方案,网站的定位前言 打牢基础,万事不愁 .C的基础语法的学习
引入 类是实现面向对象思想的主要方法.前面提到:类是函数的变种,类可以通过调用静态方法或者成员函数来实现逻辑.多数情况下使用成员函数.构造函数是生成类对象成员的必须条件,对此做一些构造函数的归纳
构造函数的目…前言 打牢基础,万事不愁 .C的基础语法的学习
引入 类是实现面向对象思想的主要方法.前面提到:类是函数的变种,类可以通过调用静态方法或者成员函数来实现逻辑.多数情况下使用成员函数.构造函数是生成类对象成员的必须条件,对此做一些构造函数的归纳
构造函数的目的 接续:做每件事之前都想想目标是什么.学习也是一样,想想设计者的思路是什么. 通常情况下类有成员属性和成员函数.构造函数的目的是为了初始化属性(给属性赋初值)
构造函数的形式 1直接赋值:最直观的形式,也是用得最多的一种,传入的 形参等于属性值 举例:
class PersonDirect {std::string name;int age;
public:PersonDirect(const std::string str,int ag):name(str),age(ag){}
}; 调用构造函数生成对象,将名称和年龄传入
PersonDirect zs_d(张三,40); //创建一个对象,姓名张三,年龄40 2部分赋值,不给属性赋初值也可以. 举例:
class PersonDirectSome {string name;int age;
public:PersonDirectSome(const string str) :name(str) {} //没有给属性age赋初值void setAge(int ag) { age ag; } //设置属性age的值int getAge() const { return age; } //读取属性age的值
}; 调用构造函数时,传入名称 PersonDirectSome zs_ds(张三);zs_ds.setAge(45);cout zs_ds.getAge() endl; 生成对象时age没有初始化,不报错.相当于属性age被悬挂起来.唯一注意的是在getAge()之前如果不调用setAge()设置值,则会出现意料之外的结果---相当于随机访问了一块内存地址,地址内值未初始化. 给属性默认赋值,所有对象的属性用同一个值,比如将上面的构造函数改成
PersonDirectSome(const string str) :name(str),age(20){} //所有对象age默认为20 则所有对象的年龄不需要传入,都被默认设成20. 3间接赋值 构造函数也表达了形参和属性之间的一种因果联系.他们不一定是赋值关系. 举例:构造函数中有表示姓的字符串fname,用一个字符lname表示名的字符串首字母.
class PersonIndirect {string fname;char lname;int age;
public:PersonIndirect(const string strf, const string strl ,int ag) :fname(strf), age(ag) {lname strl.at(0); //获得传入字符串的首字母,交给属性}char getLname() { //获得字符return lname;}
}; 调用构造函数,输入表示姓和名的字符串,生成对象. PersonIndirect zs_i(zhang, san,44);cout 对象名的首字母是: zs_i.getLname() endl;
默认构造函数 C提供了默认构造函数. 举例:
class Default { //默认构造函数
private:int age;
public:int getAge() const{ return age; }
}; 调用默认构造函数生成对象,什么都不用输入 Default df; //什么都不用输入,调用默认构造函数生成对象cout df.getAge() endl; //警告使用未初始化内存,因为没有给age赋值 如果定义了其他构造函数,默认构造函数将失效,上述代码中Default df;将报错 默认构造函数还是比较有用的,特别在类继承中,派生对象的生成必须先生成基类对象,派生类的构造函数必须要给基类构造函数传入参数.如果给基类定义默认构造函数,则可以简化派生类构造函数.例如:
class Base { //基类定义int age;
public:Base(int ag):age(ag){} //基类普通构造函数Base() { //基类提供默认构造函数 age 20;}int getAge() const { return age; }
};
class BasePlus : public Base { //派生类定义string name;
public:BasePlus(const string na,int ag):Base(ag),name(na){} //派生类普通构造函数,参数传给基类构造函数BasePlus(const stringna) :name(na) {}//派生类普通构造函数,忽略传给基类参数,使用了基类默认构造函数
}; 调用派生类构造函数,生成派生类对象 BasePlus lisi(lisi, 30); //BasePlus普通构造函数,传入年龄30给基类构造函数cout 李四的年龄是: lisi.getAge() endl;;BasePlus zs(zs); //由于基类中定义默认构造函数,简化了派生类对象生成时的编码cout 张三的年龄是: zs.getAge() endl; 所以一般需要自己定义默认构造函数,即类的构造函数两个以上,含自定义的默认构造函数 定义方法也比较简单,默认给属性赋值就可以. Base() { //基类提供默认构造函数 age 20;}
BasePlus() { //派生类默认构造函数Base(20);name nobody;} 还有一种更为简单的方法,给构造函数提供默认参数. 但是试了下如果多个函数使用默认参数的情况似乎不行,所以这是一种选项. Base(int ag20):age(ag){} //基类普通构造函数,提供默认参数//Base() { //替换部分 // age 20;//}小结 有时候觉得C的语法已经够复杂的了,像构造函数这些相对简单的内容要不要搞得那么复杂.学会后总结一些常规用法,以后就是复制和粘贴. 小结构造函数的写法: 1直接赋值,形参和属性一一对应.这也是用得最多的写法 2建议自定义默认构造函数,不写形参,直接给属性赋值. 3 默认参数,简化函数调用