承接上篇,本篇介绍构造函数的调用,
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,"张三");