高级语法

面向对象——类

C++使用struct、class来定义一个类:

  • struct 的默认成员权限是public
  • class 的默认成员权限是private
  • 除此之外,二者基本无差别。

struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。

对象的属性

C++没有类似于C#的属性,需要自己实现Get、Set方法,代码如下:

class Test
{
public:
Test(){}
Test(int _m):_cm(_m){} int GetCm() const { return _cm; }
void SetCm(int c) { _cm=c; } private:
int _cm;
};

注:Get函数需要用const修饰为常函数,参考C++ 类class const修饰成员函数

运算符重载

运算符重载函数既可以声明为类的成员函数,也可以声明为所有类之外的全局函数,参考 C++学习27 用全局函数重载运算符

  • 将运算符重载函数声明为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数。之所以少一个参数,是因为这个参数是隐含的。
  • 将运算符重载函数声明为全局函数时,二元操作符就需要两个参数,一元操作符需要一个参数,而且其中必须有一个参数是对象,好让编译器区分这是程序员自定义的运算符,防止程序员修改用于内置类型的运算符的性质。

复合赋值操作符是指 += , *= , -= 这一类由基本算数运算符( + 、 - 、 * 、 / )或位运算符(| 、 & 、~等)加 = 号构成的运算符。它们把左右操作数进行相应运算后的结果赋值给左操作符, 复合赋值操作符的返回值,默认是左值。比如a += b;中的a。

在进行复合赋值操作符重载定义的时候,需要注意,其返回值,应该为( * this)<类成员>或者第一个也就是左操作数<非成员函数>,参考 C++运算符重载

//类成员函数方法实现运算符重载
className & className::operator +=(className & right)
{
return (*this) = (*this) + right;
} //全局函数方法实现运算符重载
className& operator +=(className& left, className& right)
{
return left = left + right;
}

常用的运算符重载(类成员函数)定义如下:

// 运算符重载
className operator+(const className &c) const;
className& operator+=(const className &c);
className operator-(const className &c) const;
className& operator-=(const className &c);
className operator*(const className &c) const;
className& operator*=(const className &c);
className operator/(const className &c) const;
className& operator/=(const className &c); bool operator==(const className &c) const;
bool operator!=(const className &c) const;
bool operator>(const className &c) const;
bool operator>=(const className &c) const;
bool operator<(const className &c) const;
bool operator<=(const className &c) const; // 前置和后置++
className& operator++(); //前置++
className operator++(int); //后置++
className& operator--(); //前置--
className operator--(int); //后置-- //IO重载,全局函数
friend ostream& operator<<(ostream& os, const className &x);
friend istream& operator>>(istream& is, className &x);

拷贝构造函数

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象,参考 C++ 拷贝构造函数

拷贝构造函数通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。
  • 复制对象把它作为参数传递给函数。
  • 复制对象,并从函数返回这个对象。

拷贝构造函数的最常见形式如下:

classname (const classname &obj) {   // 构造函数的主体 }

IO缓存

C++ IO标准库 文件操作

cin.ignore(numeric_limits<std::streamsize>::max(), '\n');  // 清空缓存区脏数据

头文件的重复包含问题

方案1:使用宏来防止同一个文件被多次包含:

#ifndef _SOMEFILE_H
#define _SOMEFILE_H
//头文件内容
#endif

优点:可移植性好;

缺点:无法防止宏名重复,难以排错;

方案2:使用编译器来防止同一个文件被多次包含:

#pragma once
//头文件内容

优点:可以防止宏名重复,易排错;

缺点:可移植性不好;

总结:只考虑Windows系统可以用方案2,否则用方案1

深拷贝与浅拷贝

浅拷贝只拷贝指针地址,C++默认拷贝构造函数与赋值运算符重载都是浅拷贝;节省空间,但容易引发多次释。

深拷贝重新分配堆内存,拷贝指针指向内容;浪费空间,但不会导致多次释放。

兼有二者的优点:

  • 方案一:引用计数
  • 方案二:C++新标准的移动语义
// 移动赋值运算符
String& String::operator=(String&& rhs)noexcept
{
if(this != &rhs)
{
delete[] m_data;
m_data = rhs.m_data;
rhs.m_data = NULL;
}
return *this;
} // 移动构造函数
String::String(String&& other)
{
if (other.m_data != NULL)
{
// 资源让渡
m_data = other.m_data;
other.m_data = NULL;
}
} //使用
String s1("Hello");
String s2A(std::move(s1)); // 移动构造函数
String s3A; // 无参构造函数
s3A = std::move(s2A); // 移动赋值运算符

面向对象三大特性

封装性:数据和代码捆绑在一起,避免外界干扰和不确定性访问,封装可以使得代码模块化

继承性:让某种类型对象获得另一个类型对象的属性和方法,继承可以扩展已存在的代码

多态性:同一事物表现出不同事物的能力,即向不同对象会产生不同的行为,多态的目的则是为了接口重用

C++学习笔记之高级语法的更多相关文章

  1. Hadoop学习笔记(7) ——高级编程

    Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成 ...

  2. python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样

    python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样,IDLE shell编辑器,快捷键:ALT+p,上一个历史输入内容,ALT+n 下一个历史输入 ...

  3. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  4. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  5. Java学习笔记之---基础语法

    Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...

  6. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色

    一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...

  7. matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象

    一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...

  8. Webpack4 学习笔记三 ES6+语法降级为ES5

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 将es6.es7语法降级为es5 需要通过 babel JavaScript编译器. 安装: npm i babel ...

  9. CUBRID学习笔记 41 sql语法之select

    cubrid的中sql查询语法 SELECT [ ] [{TO | INTO} ][FROM ] [WHERE ][GROUP BY {col_name | expr} [ASC | DESC], . ...

  10. java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象

     JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...

随机推荐

  1. C# 中类与继承等概念

    C#是一种现代的.面向对象的编程语言,其中类和继承是面向对象编程语言中非常重要的概念,类和继承是C#中面向对象编程的基本概念,可以用于创建复杂的应用程序和模块,而多态和接口可以使程序更加灵活和可扩展. ...

  2. Linux基础命令 [补档-2023-06-28]

    Linux基础命令 1-1.命令的基本格式 ​ Linux系统命令的通用格式为: ​ command [-options] [parameter] ​ 其中 ​ -command 命令本身 ​ -op ...

  3. 一篇带你掌握cmake入门|了解cmake|掌握cmake基本操作

    一篇带你掌握cmake入门 内容出处: 作者: 苏丙榅 链接: https://subingwen.cn/cmake/CMake-primer/ 来源: 爱编程的大丙 著作权归作者所有.商业转载请联系 ...

  4. 【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释

    [栈和队列]栈和队列的相互实现OJ练习[力扣-232.力扣-225]超详细的保姆级别解释 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 ...

  5. 【奶奶看了都会】云服务器部署开源ChatGLM-6B,让你也能拥有自己的ChatGPT

    1.背景 大家好啊,我是小卷. 最近ChatGPT不仅发布了GPT-4,而且解除封印可以联网了.不得不赞叹AI更新迭代的速度真快,都跟不上节奏了.但是大家也注意到了吧,随着ChatGPT的每次更新,O ...

  6. 【奶奶看了都会】ChatGPT3.5接入企业微信,可连续对话

    1.连续对话效果 小伙伴们,这周ChatGPT放出大招,开放了GPT3.5的API.说简单点,就是提供了和ChatGPT页面对话一样模型的接口.而之前接的ChatGPT接口都是3.0,并不是真正的Ch ...

  7. ASP.NET Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记

    任务10:第三方ClientCredential模式调用 创建一个控制台程序 dotnet new console --name ThirdPartyDemo 添加 Nuget 包:IdentityM ...

  8. JS leetcode 反转字符串中的单词 III 题解分析

    壹 ❀ 引 又到了快乐的leetcode算法时间,今天的题目特别特别简单,来自leetcode557. 反转字符串中的单词 III,题目描述如下: 给定一个字符串,你需要反转字符串中每个单词的字符顺序 ...

  9. C# 12 中新增的八大功能你都知道吗?

    前言 转眼之间C#都已经更新到了12了,那么C# 12 中新增的八大功能你都了解过吗?今天我们来简单介绍一下C# 12 中新增的八大功能. C#/.NET该如何自学入门?:https://www.cn ...

  10. Java设计模式-组合模式Composite

    介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. 组合模式依据树形结构来组合对 ...