本博客将记录:类的相关知识点的第4节的笔记!
(这个在学习C++基础课程时已经学习过一次了,这里再次简单地回顾一下而已)
今天总结的知识分为以下5个点:
一、在类相关的非成员函数
二、类内初始化
三、const成员变量的初始化
四、默认构造函数
五、=default;=delete;(这2个关键字我之前没遇到过!好好总结!)
一、在类相关的非成员函数:
有时候,我们总会在类内,定义一些,与类有一点关系的,但是又想不让它作为该类的成员函数的函数。那么这些函数我们就称之为与类相关的非成员函数。
非成员函数的使用:(分两步)
①将该函数的原型声明放在类.h头文件中的类声明的分号后面
②将该函数的具体实现(定义)的代码放在类.cpp源文件中
请看以下代码:
Scores.h
#ifndef __SCORES_H__ #define __SCORES_H__ #includeusing namespace std; class Scores { public: double m_MathScores; double m_EnglishScores; double m_ChineseScores; public: Scores() :m_MathScores(0.0), m_EnglishScores(0.0), m_ChineseScores(0.0) {} Scores(double m,double e,double c) :m_MathScores(m), m_EnglishScores(e), m_ChineseScores(c) {} }; //在类的.h头文件之外do 与类相关的非成员函数的函数原型声明 void ShowScores(const Scores& s); #endif
Scores.cpp
#include"Scores.h"
//在类的.cpp源文件中do 与类相关的非成员函数的具体实现(定义)
void ShowScores(const Scores &s) {
cout << s.m_MathScores << "t" <<
s.m_EnglishScores << "t" <<
s.m_ChineseScores << endl;
}
main.cpp
#includeusing namespace std; #include"Scores.h" int main(void) { Scores s(100, 100, 99.9); ShowScores(s);//调用 与类相关的非成员函数 //result: 100 100 99.9 return 0; }
相信通过以上的代码分析,你可以非常容易地掌握在类中如何写与类相关的非成员函数并调用该种函数的小技巧。
二、类内初始化:
在c++11中,我们可以为类内的成员变量提供一个初始值。这样做会使得我们在创建对象时,这个初始值就可以用来初始化该成员变量了(即便你创建对象时没给其赋值,也会用这个类内的初始化值来初始化该成员变量)。
请看以下代码:(在上述的Scores类的代码中作如下修改)
Scores.h
#ifndef __SCORES_H__ #define __SCORES_H__ #includeusing namespace std; class Scores { public: double m_MathScores = 60.0; double m_EnglishScores = 60.0; double m_ChineseScores = 60.0; public: Scores(){} //Scores() :m_MathScores(0.0), m_EnglishScores(0.0), m_ChineseScores(0.0) {} Scores(double m,double e,double c) :m_MathScores(m), m_EnglishScores(e), m_ChineseScores(c) {} }; //在类的.h头文件之外do 与类相关的非成员函数的函数原型声明 void ShowScores(const Scores& s); #endif
main.cpp
int main(void) {
Scores s;
ShowScores(s);
//result: 60 60 60
return 0;
}
三、const成员变量的初始化:
const成员变量必须的要先给定初始值。你有两种方式给const的成员变量给定初始值
①直接在类内定义const的成员变量时赋值
比如:
public:
//
double m_MathScores = 60.0;
double m_EnglishScores = 60.0;
double m_ChineseScores = 60.0;
//给const成员变量赋初值!
const double ctestval = 80;
②在类内的定义时不赋值,转而在构造函数的初始化列表中给其赋值
比如:
public:
double m_MathScores = 60.0;
double m_EnglishScores = 60.0;
double m_ChineseScores = 60.0;
//在类内定义const的成员变量时,不赋值
const double ctestval;
public:
//在构造函数中给const的成员变量赋初值
Scores(int ct):ctestval(ct){}
//Scores(int ct){ ctestval = ct;}
//错误!const的成员变量只可以在类的构造函数的初始化列表中被赋初值
//const成员变量不可以在类的构造函数中通过赋值操作对其进行初始化
//Scores() :m_MathScores(0.0), m_EnglishScores(0.0), m_ChineseScores(0.0) {}
Scores(double m,double e,double c,double ct) :m_MathScores(m), m_EnglishScores(e), m_ChineseScores(c), ctestval(ct) {}
当然,一旦该构造函数给定了 const成员变量的值时,这个变量的值就不能够再发生变化了,因为const嘛!
四、默认构造函数:
所谓的默认构造函数,其实就是没有任何参数的构造函数。
注意事项:
①如果我们写类时没有定义任何类型的构造函数,那么编译器就会为我们自动生成一个默认的无参的空实现的构造函数(这种函数有个特殊名称:“合成的默认构造函数”)
其实,当我们定义一个类时,只要我们不自定义任何的构造函数和析构函数
那么编译器就会自动给我们定义:
一个默认的无参空实现的构造函数
一个默认的拷贝构造函数
一个默认的空实现的析构函数
②我们写类定义时,最好还是自己写上所需要的构造函数(有参/无参/拷贝)以及行之有效的析构函数,这里的行之有效就是提醒你,在堆区手动开辟的空间要自己手动释放掉。
new 与 delete对应
new [] 与 delete []对应
Scores.h
explicit Scores::Scores();//Scores的默认构造函数
Scores.cpp
Scores::Scores() {
cout << "Scores的默认构造函数给调用了!" << endl;
this->m_ChineseScores = 1;
this->m_EnglishScores = 1;
this->m_MathScores = 1;
//this->ctestval = 1;
}
main.cpp
Scores s ; ShowScores(s);
运行结果:
五、=default;=delete;
=default; 与=delete这2个关键字是c++11新引入的。
①=default; 是用在写默认的无参的空实现的构造函数上的,作用:编译器会自动为这种带有 =default关键字的构造函数生成空的函数体,也即生成 { }。注意:该=default关键字不能用在普通的函数上!
也即Scores(){ } <==> Scores() = default;
请看以下代码:
Scores(int a){}
当Scores类只有上述一个有参的构造函数时
Scores s; //报错!因为此时编译器不会为我们自动生成一个默认的构造函数 //而我们又没有定义无参构造函数,因此无法编译通过! ShowScores(s);
//使用 =default;
Scores() = default;//<==> 就相当于 Scores() {} 的意思!
//因为编译器会自动为这种带有 =default关键字的函数生成空的函数体,也即生成 { }
注意事项:
①=default关键字只可以用在默认的构造函数、拷贝构造函数和析构函数中。
②=delete;用在程序员自己禁止写的某些类型的函数上,作用:就是删除你指定的返回值类型以及参数类型的函数,让后序开发中你or他人无法定义此类函数。注意:该=delete关键字可用在类的成员函数or其他all的普通函数上,也即可用在任何函数中。
请看以下代码:
//main.cpp中
int func1() {}
void func2() = delete;
//main函数中 func1();//√,正确!因为程序员没禁用这个函数(没对该函数声明=delete) func2();//×,错误!因为程序员禁用了这个函数(对该函数声明了=delete)
在此,我只是简单介绍一下=default和=delete这2个c++11中引入的关键字而已,后续coding中如果再遇到复杂的对u这2个关键字的使用case,我会再详细学习和总结。
好,那么以上就是这一3.4小节我所回顾的内容的学习笔记,希望你能读懂并且消化完,也希望自己能牢记这些小小的细节知识点,加油吧,我们都在coding的路上~



