一、在类定义中实现成员函数inline

类内的成员函实现其实也叫作类内的成员函数定义。

这种直接在类的定义中实现的函数,会被当做inline内联函数来处理。

二、成员函数末尾的const

const:常量,在成员函数后面增加一个const。不但需要在成员函数声明的中增加const,也要在成员函数定义中增加const。

作用:告诉系统,这个成员函数不会修改对象里面任何变量的值等等,也就是说,这个成员函数不会修改MyTime类的任何状态。

函数末尾增加一个const称为常量成员函数。

三、mutable

mutable,不稳定,容易被改变,mutable的引入是为了突破const的限制

一旦一个成员变量被mutable修饰了,就表示这个成员变量永远处于可以被修改的状态,即便是在const结尾的成员函数中也可以被修改。

const成员函数,则不管是const对象,还是非const对象,都可以调用const成员函数

而非const成员函数不能被const对象调用。

四、返回自身对象的引用,this

如何理解这个this?在调用成员函数时,编译器负责将这个对象的地址(&mytime)传递给这个成员函数中的一个隐藏的this形参。

在系统角度看来,任何对类成员的访问都被看做是通过this做隐式调用的。

(1)this指针只能在成员函数中使用,全局函数,静态函数不能使用this指针

(2)在普通函数中,this是指向非const对象的const指针(类型为MyTime,那么this就是MyTime *const this),表示this只能指向当前MyTime对象。

(3)在const成员函数中,this指针是一个指向const对象的const指针(类型为MyTime,this就是const MyTime *const this 类型的指针)

MyTime mytime;
mytime.addMinute();
mytime.addSecond().addMinute();

五、static成员

有属于整个类的成员变量,这种成员变量就是static成员变量(静态成员变量)。

特点:不属于某个对象,属于整个类,我们一旦在某个对象中修改了这个成员变量的值,在其他对象中可以看到修改后的结果。

这种成员变量只有一个副本,对于这种成员变量的引用,我们用的是类名::成员变量名。

成员函数前面也可以加static构成静态成员函数,属于整个类的成员函数,调用的时候用类名::成员函数名。

如何定义静态成员变量:我们一般在某个.cpp源文件的开头来定义这个静态成员变量。这样就能保证在调用任何函数之前这个静态成员变量已经被初始化。

本节工程案例:

#include <iostream>

#include "head.h"
using namespace std; static int g_abc = ; // 保存在静态存储区 void func()
{
static int abc = ; // 局部静态变量
abc = ; // 下次执行时static int abc = 5;这条语句不执行,每次执行完保存最后修改的abc的值
} // 静态成员变量定义
int MyTime::static_value = ; // 可以不初始化,系统默认给0,定义时不需要static int main()
{
MyTime mytime;
mytime.addMinute();
mytime.addSecond().addMinute();
MyTime mytime1;
mytime1.Minute = ;
MyTime mytime2;
mytime2.Minute = ; cout << mytime1.Minute << endl;
cout << mytime2.Minute << endl;
return ;
} // MyTime.h文件
#ifndef __MYTIME__
#define __MYTIME__ class MyTime
{
public:
// 成员变量
int Hour;
int Minute;
int Second; mutable int testValue;
     private:
// 成员变量
int Millsecond;
public:
//成员函数
void initMillTime(int tmpMillTime);
// 构造函数
explicit Time(int tmphour,int tmpminute,int tmpsecond);
Time(int tmphour,int tmpminute);
explicit Time(int tmphour);
explicit Time();
    static int static_value; // 静态成员变量声明
public:
void addhour(int tmphour) const;
//{
//Hour += tmphour;
//} MyTime& addMinute(int tmpMinute);
MyTime& addSecond(int tmpSecond);
} #endif // MyTime.cpp文件
#include "head.h" void MyTime::initMillTime(int tmpMillTime)
{
Millsecond = tmpMillTime;
}
// 构造函数
MyTime::Time(int tmphour,int tmpminute,int tmpsecond)
{
Hour = tmphour;
Minute = tmpminute;
Second = tmpsecond;
} MyTime::Time(int tmphour,int tmpminute)
{
Hour = tmphour;
Minute = tmpminute;
} MyTime::Time(int tmphour)
{
Hour = tmphour;
} MyTime::Time()
{} void MyTime::addhour(int tmphour) const
{
// Minute = tmphour; // 不允许修改类对象里面的任何成员
testValue = tmphour; //给要改变的变量前面加一个mutable就可以修改了
} MyTime& MyTime::addMinute(int tmpMinute)
{
Minute = tmpMinute;
return *this; // 返回对象本身
}
 MyTime& MyTime::addSecond(int Second)
{
this->Second = Second;
return *this; // 返回对象本身
}

六、类内初始化

在C++11离,我么可以为类内成员变量提供一个初始值,则我们在创建对象的时候,这个初始值就用来初始化该成员变量。

七、const成员变量的初始化,在构造函数的初始化列表里进行,不可以通过赋值来初始化。

八、默认构造函数

默认构造函数,即没有参数的构造函数就是默认构造函数。

没有构造函数,这些类对象时如何调用的?这叫做默认初始化,也就是说类通过一个特殊的构造函数来执行默认的初始化过程。

这个特殊的构造函数就叫做“默认的构造函数”。也就是无参的构造函数。

在类定义中,如果没有构造函数的情况下,编译器会为我们隐式的自动定义一个默认的构造函数。称为“合成的默认构造函数”。

一旦我们自己写了一个构造函数,不管这个构造函数带几个参数,编译器就不会为我们创建“合成的默认构造函数”。

九、=default,=delete

=default 编译器能自动为我们生成函数体,一般只能以用于默认的特殊成员函数

十、拷贝构造函数

默认情况下,类对象的拷贝时每个成员变量的逐个拷贝。

如果一个类的构造函数的第一个参数是所属的类类型的引用,如果还有其他额外参数,那么这些额外的参数还都有默认值,则这个构造函数称为拷贝构造函数。

函数默认参数必须放在函数声明中,除非该函数没有函数声明。

(1)拷贝函数第一个参数总是带着const

(2)explicit:拷贝构造函数一般不要声明为explicit

成员函数逐个拷贝的功能因为我们自己定义的拷贝构造函数的存在而丢失了作用。

或者说我们自己的拷贝函数取代了系统默认的每个变量逐个拷贝的行为。

(a)如果我们没有定义一个拷贝构造函数,编译器会为我们定义一个;

(b)如果是编译器给我们合成的拷贝构造函数,这个拷贝构造函数一般也是将参数tmpTime(类对象)的成员逐个拷贝到正在创建的对象中。

每个成员的类型决定了它如何拷贝,比如说成员变量是整型的,那么直接把值拷贝过来;

如果成员变量是类类型,那么会调用这个类的拷贝构造函数来拷贝。

(c)如果自己定义了拷贝构造函数,那么就取代了系统合成的拷贝构造函数,这个时候,你就必须在自己的拷贝构造函数中给类成员变量赋值,以免出现类成员没有被赋值就使用的情况发生。

还有一些情况会发生调用拷贝构造函数的情况:

(1)将一个对象作为实际参数传给一个非引用类型的参数。

(2)从一个函数中返回一个对象的时候。

C++基础知识-inline、const、mutable、this、static的更多相关文章

  1. c++ 基础知识 0001 const 知识1

    1. C++ const用法 尽可能使用const 2. C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就 ...

  2. Java基础知识强化02:import static 和 import

    1.import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com..... ...

  3. JAVA基础知识(2)--关键字static的使用

    在Java类中声明属性.方法和内部类时,可使用关键字static作为修饰符,static标记的属性和方法可以由整个类进行共享,因此static修饰的属性称为类成员或者称为类方法:static修饰的方法 ...

  4. c++ 基础知识 0001 const 知识2

    1.const修饰函数返回值 (1)指针传递 如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer.因为指针指向的 ...

  5. JAVA核心技术I---JAVA基础知识(static关键字)

    一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...

  6. 大话java基础知识一之为什么java的主函数入口必须是public static void

    为什么java的主函数入口必须是public static void main (String[] args); 很多写javaEE好几年的程序员经常会记得java的主函数就是这么写的,但实际上为什么 ...

  7. C#基础知识七之const和readonly关键字

    前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...

  8. (C/C++学习笔记) 一. 基础知识

    一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...

  9. SWIG 3 中文手册——5. SWIG 基础知识

    目录 5 SWIG 基础知识 5.1 运行 SWIG 5.1.1 输入格式 5.1.2 SWIG 输出 5.1.3 注释 5.1.4 C 预处理器 5.1.5 SWIG 指令 5.1.6 解析限制 5 ...

随机推荐

  1. errorlevel 续2

    -------siwuxie095             %ERRORLEVEL%值一览表:     ATTRIB.EXE (a) Target file/folder not found = ER ...

  2. IPMI (Intelligent Platform Management Interface)

    4.3. ipmitool - utility for controlling IPMI-enabled devices 4.3.1. ipmitool 4.3.1.1. ubuntu 确定硬件是否支 ...

  3. c语言静态断言

    在php中可以通过xdebug来显示详细的错误信息,可以细化到哪个文件哪行代码引起的报错.在C语言里面也可以通过静态断言(assert)来使得调试代码更加方便.关于断言,可以作为一种很强大的调试方式或 ...

  4. [IIS] 测试的产品登陆之后有个引用外部站点js的请求半天都无法返回,导致网页一直在打转,Selenium的driver也无法对页面进行下一步的操作

    测试的产品登陆之后有个引用外部站点js的请求半天都无法返回: https://cdn.heapanalytics.com/js/heap-3497400264.js 这个js如果是在美国的机器上就可以 ...

  5. iPhone X 的“刘海”正是苹果的品牌象征

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 在iPhone X发布活动结束之后,关于其在屏幕顶端独特的“刘海”设计,引起了不少人的讨论.其实,这 ...

  6. 【转】java遍历实体类的属性和数据类型以及属性值

    和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...

  7. 前端福利之盘飞那个 "阿里矢量图" (转)

    一.准备工作 1.首先,进入阿里的矢量图标库,在这个图标库里面可以找到很多图片资源,当然了需要登录才能下载或者使用,用GitHub账号或者新浪微博账号登录都可以 2.登录以后,可以搜索自己需要的资源, ...

  8. 初步理解IOC和DI和AOP模式

    初步理解IOC和DI和AOP模式 控制反转(IOC) 控制反转(IOC,Inversion of Control)是一种转主动为被动关系的一种编程模式,有点类似于工厂模式,举个栗子, 下面这个这不是I ...

  9. ASP.NET MVC学习笔记(二)登陆验证

    书上的验证时在配置文件中直接声明用户名和密码,想改成从数据验证账号和密码,搞了一下午都没高出来,不断的调试,发现 var table = userInfo.Tables.FirstOrDefault( ...

  10. QT的配置及目录结构

    作者:一去丶二三里 来源:CSDN 原文:https://blog.csdn.net/liang19890820/article/details/51774724 注意:所有的配置中,/user中的/ ...