承接上篇,本篇介绍构造函数的调用,
1.调用的相关性质如下:
//(1)作用:用于对象的初始化,在定义的时候就定义对象的初值 //(2)写法:函数名是类名;不写函数的返回值;参数可以有也可以没有 //(3)构造函数允许函数重载 //(4)如果类中一个构造函数都没有,编译器会提供一个默认的构造函数(无参的构造,可能会被优化) //explicit CStudent(char* pszName) {strcpy_s(m_szName, pszName);};只支持显示调用构造函数CStudent stu("张三");,不允许隐式转换 CStudent stu="张三" //explicit关键字增加后只支持显示调用构造函数CStudent stu("张三");,不允许隐式转换 CStudent stu="张三";就无法编译通过,这种是隐式转换的写法 //(6)=default 显示的指出来创建默认的构造函数 // CStudent=delete 表示禁止使用某函数,删除构造函数,没有构造函数
2.视频学习地址:构造函数的调用
3.学习笔记:
#include <iostream> //构造与析构 //构造函数: //(1)作用:用于对象的初始化,在定义的时候就定义对象的初值 //(2)写法:函数名是类名;不写函数的返回值;参数可以有也可以没有 //(3)构造函数允许函数重载 //(4)如果类中一个构造函数都没有,编译器会提供一个默认的构造函数(无参的构造,可能会被优化) //explicit CStudent(char* pszName) {strcpy_s(m_szName, pszName);};只支持显示调用构造函数CStudent stu("张三");,不允许隐式转换 CStudent stu="张三" //explicit关键字增加后只支持显示调用构造函数CStudent stu("张三");,不允许隐式转换 CStudent stu="张三";就无法编译通过,这种是隐式转换的写法 //(6)=default 显示的指出来创建默认的构造函数 // CStudent=delete 表示禁止使用某函数,删除构造函数,没有构造函数 class CStudent { public: //无参构造函数 CStudent() { //strcpy_s(m_szName, pszName); } //一个参数的构造函数 CStudent(char* pszName) { strcpy_s(m_szName, pszName); } //两个参数的构造函数 CStudent(int nStuID,char* pszName) { strcpy_s(m_szName, pszName); } void SetName(char* pszName) { //存在缓冲区溢出的风险,pszName并不知道指向的字符串的大小,若大于255,则可能将原来字符串末尾覆盖 strcpy_s(m_szName,pszName);//m_szName并未定义大小,存在溢出风险,系统提示使用strcpy_s } private: int m_nStudID;//学号 char m_szName[255];//255个字节的缓冲区,姓名 }; int main(int argc,char* argv[]) { //CStudent stu2;//无参的构造调用 //C++中给对象进行赋值的方法,按照构造函数参数要求写入数据 //CStudent stu("张三");//一个参数的构造调用 //CStudent stu="张三";//一个参数的构造调用,一种隐式转换的含义 //2个参数的构造调用 //CStudent stu(1,"张三"); //CStudent stu=CStudent(1,"张三"); //分别创建对象就显得很麻烦,在变量定义的时候就可以赋初值,对象是否可以赋初值 //stu.SetName("张三"); /*CStudent stu2;*/ //stu.SetName("李四"); return 0; }
4.特别注意构造函数调用的写法:
CStudent stu=CStudent(1,"张三");