初识C++系列
文章平均质量分 56
我叫龙傲天
相信微末的力量
展开
-
初识c++(37)基于对象的编程思想
基于对象的编程思想在c++中面向对象的编程思想是基于c++中的各种虚机制来完成的,这里就不详细展开啦。而基于对象的编程思想则是基于std::function和std::bind两个函数来实现的。std::function和std::bindhttp://www.cplusplus.com/reference/functional/bind/?kw=bindhttp://www.cp...原创 2019-12-11 10:23:50 · 249 阅读 · 0 评论 -
初识c++(36)之模板函数与分离编译模式
分离编译模式一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程称为分离编译模式。举个例子://main.cpp#include <iostream>#include "hello.h"int main(int argc, char** argv) { my_function(1); r...原创 2019-11-07 10:33:00 · 181 阅读 · 0 评论 -
初识c++(35)之传递二维数组
在传递一维数组的时候,可以简单粗暴的传递指针。但是对于二维数组来说,必须知道数组的第二维的信息,才可以正确的进行索引。以下几种做法可以正确的传递二维数组。#include <iostream>using namespace std;/*传二维数组*///第1种方式:传数组,第二维必须标明/*void display(int arr[][4])*/void displ...原创 2019-10-21 10:32:23 · 724 阅读 · 0 评论 -
初识c++(31)之返回值优化
返回值优化(Return value optimization,缩写为RVO)是C++的一项编译优化技术。它最大的好处是在于: 可以省略函数返回过程中复制构造函数的多余调用,解决 “C++ 中长久以来为人们所诟病的临时对象的效率问题”。先来看一下测试代码:#include<iostream>using namespace std; class A{public:...原创 2019-08-24 17:44:55 · 276 阅读 · 1 评论 -
初识c++(24)之虚函数的简单应用以及类成员函数重载、覆盖和隐藏的区别以及控制字override、final的用法
关于虚函数的定义可以看我的上一个博客:https://blog.csdn.net/shaochuang1/article/details/99072309虚函数的简单应用虚函数存在的意义主要就是,让派生类覆盖基类中的部分成员函数,有时候基类中的成员函数都为纯虚函数,只是为了提供一个结构,而真正的定义都在派生类中。例子:#include<iostream>using ...原创 2019-08-10 16:05:44 · 164 阅读 · 0 评论 -
初识C++(23)之虚函数、虚指针、虚表的定义
虚函数对于类的成员函数,如果在前面加上virtual,那么这个成员函数就是虚函数,这个类就是带有虚函数的类。虚指针,虚表带没有虚函数的类,与不带虚函数的类之间有什么区别呢?带有虚函数的类比不带虚函数的类会多一个指针,这个指针就是虚指针,而虚指针指向一个表,这个表就叫做虚表。虚表里面存的内容就是虚函数的地址。例子:#include <iostream>using ...原创 2019-08-10 14:59:25 · 503 阅读 · 0 评论 -
初识c++(22)之main函数的形参使用
众所周知,c++程序主要是由一个一个的函数构成的,最特殊的应该就是main函数啦。以前都知道main函数有系统调用,大多时候我们写的main函数也是没有形参的,如果有形参那么我们又将如何赋给这些形参值呢?先看带形参的main函数是怎么写的:int main(int argc,char** argv)int main(int argc,char* argv[])这是我在网上找到的...原创 2019-08-10 09:14:32 · 493 阅读 · 0 评论 -
初识c++(27)之创建一个没有参数的类对象时,不能加括号
全世界可能只有我自己会犯这样的错误class A{ public: A(){cout << “不带参数的构造函数” << endl;} A(int i){ cout << "带参数的构造函数" << endl;}}int main(){ A a;//A a{}跟这样的写法等价//使用不带参...原创 2019-08-19 15:44:42 · 563 阅读 · 0 评论 -
初识c++(21)之数组长度是否可以为变量
对于c++中数组的长度是否可以是变量,网上众说纷纭 。现来看看c++ primer第五版上怎么说的:上面说的很清楚,不能用一个变量来初始化数组的长度。但是我在网上找到了这样一个代码:#include <iostream>using namespace std;int main(){ int a =0; cin >> a; int ar...原创 2019-08-07 15:46:55 · 2311 阅读 · 0 评论 -
初识c++(25)之c++中的多态特性(静多态、动多态)(静态绑定(早绑定)、动态绑定(晚绑定))
静态绑定(早绑定)、动态绑定(晚绑定)什么是绑定?绑定就是将函数体与函数调用之间关联起来。静态绑定就是早绑定,静态绑定是指在编译阶段,就将函数体与函数调用之间关联起来。动态绑定就是晚绑定,动态绑定是指在程序运行阶段,才将函数体与函数调用之间关联起来。在c++中能实现动态绑定的机制就是虚函数(也可以用函数指针来实现,其实虚函数的底层就是一个函数指针,但是函数指针更为常见),虚函数才会实现...原创 2019-08-12 17:11:53 · 381 阅读 · 0 评论 -
初识c++(26)之虚析构函数
阅读这篇博客之前需要有动多态的概念,可以配合我的上一篇博客共同食用:https://blog.csdn.net/shaochuang1/article/details/99305833虚析构函数的应用场景:当我们在使用多态的时候,需要将基类指针指向new出来的派生类对象,在使用结束后,需要delete这个指针时就会出现问题。由于这个指针是基类指针,delete这个指针也只会触发基类的析构函数...原创 2019-08-13 11:03:48 · 147 阅读 · 0 评论 -
初识c++(28)之多继承、虚继承
多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示:类 A...原创 2019-08-22 16:44:34 · 215 阅读 · 1 评论 -
初识c++(29)之拷贝构造函数的形参为什么必须是const引用
拷贝构造函数的形参必须是引用,这是编译器强制规定的,否则不能编译通过。为什么?调用拷贝构造函数的三种情况用已知的对象拷贝生成新对象 以值传递的方式传入函数 函数的返回值是以值传递的方式形参为什么一定要传引用假如我们的拷贝构造函数是这样的A(Aa);,这是一个值传递,那我们会调用一个拷贝构造函数,而调用的拷贝构造函数还是值传递,那么我们就需要继续调用拷贝构造函数,这样的的话就...原创 2019-08-29 16:30:58 · 1543 阅读 · 0 评论 -
初识c++(30)之由右值引出来的一系列概念(左值,右值,移动语义,move,完美接收,forward)
C++11为了解决这两个问题对右值的概念进行可扩充临时对象非必要的拷贝操作应用于普通函数 应用于类的移动构造函数(移动语义)模板函数中如何按照参数的实际类型进行转发什么是右值在c++11之前就有左值、和右值的概念。可以这样理解,左值是有名字的值,而右值是没有名字的值(粗略的讲就是临时变量),由于右值没有名字,无法进行引用,它将会在它出现的语句运行结束后马上死亡。这种机制导致了...原创 2019-08-31 12:04:55 · 272 阅读 · 0 评论 -
初识C++(32)之异常处理(try、catch、throw)
异常处理这是一个对c++工程代码测试的一种方式。主要用于编译通过,但是运行出错的工程,而且可以在不中断工程的情况下抛出异常,最重要的是可以确定错误的类型,和出错的函数。这样就不用使用print()调试大法了。关键字介绍try:测试的代码就是放在try{ }中,如果测试的代码块中发生异常,并由throw抛出,catch就会来接受这个异常。 throw:throw是放在try块中的,...原创 2019-09-05 16:51:48 · 814 阅读 · 2 评论 -
初识c++(33)之用星花*定义指针时,星花*的右结合性
int* i;int *j;以上这两种方法都有人使用,在这种情况下也是等价的。但是要知道*星花是右结合的,即无论哪种写法,(* i)、(*j)是一个整体。int* i, j;这种情况下,等价于int *i; int j;如果要想连续定义两个指针变量,就要用下面的写法;int *i, *j;...原创 2019-09-10 09:01:53 · 352 阅读 · 0 评论 -
初识c++(34)之大括号{}与变量的作用域
c++支持在程序的任何地方定义变量,那么变量的作用域就极为重要,这些作用域是用大括号{}来划分的。例子:#include<iostream>using namespace std;class A{ public: A(){cout << "构造函数" << endl; } ~A(){cout << "析构函数" <...原创 2019-09-18 17:00:55 · 1754 阅读 · 0 评论 -
初识c++(20)之友元函数、友元类
写在前面的话:也忘了在哪里看到的这一句话:类就像是墙,把对象给保护起来啦,但是友元就像是墙上的一道门。这样做增加了程序的灵活性,但是同时也增加了风险性,所以要谨慎使用。在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可...原创 2019-08-06 14:49:46 · 134 阅读 · 0 评论 -
初识c++(19)之private、protected、public以及不写时之间的区别
先说不写时的默认情况,class默认为private,struct默认为publicprivate,public,protected的访问范围:private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问.protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问public: 可以被该类中的函数、子类的函数、其友...原创 2019-08-05 21:27:09 · 2223 阅读 · 0 评论 -
c++STL剖析(2)之sort()
sort()包含于#include <algorithm>头文件,这是一个十分值得玩味的头文件。sort()有两种形式:template <class RandomAccessIterator>void sort (RandomAccessIterator first, RandomAccessIterator last);template <class...原创 2019-07-28 00:34:19 · 92 阅读 · 0 评论 -
初识C++(5)-带指针类的拷贝(一)
#include <iostream>#include <cstring>using namespace std;class String{private: char* m_data;public: String(const char* cstr); String(const String& str); ~String(...原创 2019-07-12 22:38:26 · 587 阅读 · 0 评论 -
初识C++(5)-带指针类的拷贝(二)
接着上一次的博客继续探讨:#include <iostream>#include <cstring>using namespace std;class String{private: char* m_data; char* n_data;public: String(const char* m_cstr,const char* n_...原创 2019-07-13 10:44:15 · 912 阅读 · 0 评论 -
初识C++(1)之内联函数、构造函数初始化列表、非成员函数操作符的重载、public与private
先上自己的关于类的小代码:#include <iostream>using namespace std;class complex{private: int re; int im;public: complex(int r ,int i ); ~complex(); inline int real() const { retur...原创 2019-07-09 20:08:43 · 269 阅读 · 0 评论 -
初识C++(2)之成员函数的操作符重载
操作符重载分为成员操作符重载(number function)和非成员操作符重载(non-number functon),并不是所有的操作符都可以进行非成员函数操作符重载的,具体可以参考官网:http://www.cplusplus.com/doc/tutorial/templates/先上代码:#include <iostream>using namespace st...原创 2019-07-11 10:20:06 · 223 阅读 · 0 评论 -
C++初识(4)关于传值、传引用
#include <iostream>using namespace std;class complex{private: int re; int im;public: complex(int r ,int i ); //错误写法, complex(int r = 0,int i = 0 ); ~complex(); inline ...原创 2019-07-11 12:01:18 · 109 阅读 · 0 评论 -
初识C++(6)之C++中的堆和栈、delete和delete[ ]
C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉, 资源将由操作系统在程序结束后自动回收。自由存储区:是由ma...原创 2019-07-15 20:33:55 · 365 阅读 · 0 评论 -
初识C++(7)之static在类中的应用以及单例
static类成员C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象存在。static类数据成员是与类关联的,但不与该类定义的对象有任何关系。即static不会像普通类数据成员一样每一个类对象都有一份,全部类对象是共享一个static类成员的。例如A类对象修改了static成员为1,那么B对象对应的static类对象成员的值也会是1...原创 2019-07-16 22:06:59 · 511 阅读 · 1 评论 -
初始c++(13)之关于typename和size_t的讨论
typedef typename std::vector<T>::size_type size_type;c++ premier中多次出现上面的代码,让人看了似曾相识,但是有觉得什么都不是,因为这里包含了好几个知识点,让我来慢慢解答。1.独立于对象存在的类成员首先来看这句:std::vector<T>::size_type要想知道上面的代码什么意思,...原创 2019-07-23 21:06:26 · 819 阅读 · 0 评论 -
初识c++(17)之函数指针及其应用实例
函数指针函数指针、指针函数一直都是一起出现的内容,但是两者知识名字相似罢了,基本没有什么关联。指针函数:就是返回值是一个指针的函数,太过简单,我这里就不赘述了。函数指针:是一个指向函数的指针,这个就有点意思了。听我慢慢道来。int a[10];int function(int i,int j);这是我们定义的一个数组,众所周知,我们可以用数组名"a"来表示这个数组的地址。对...原创 2019-07-29 11:46:56 · 508 阅读 · 0 评论 -
初识c++(14)之仿函数(function-like class)和像指针的类(pointer-like class)"()"和“->”和“*”的重载
仿函数(function-like class)仿函数就是一种看起来就像是函数的类,其实是对“()”的重载。class Func{ public: void operator() (const string& str) const { cout<<str<<endl; }};in...原创 2019-07-24 15:40:22 · 443 阅读 · 0 评论 -
初识C++(10)之编译器在进入main函数之前还可以运行其他函数
直接上例子: #include <iostream>using namespace std;int test(){ cout << "test" << endl; return 54;}int i = test();int main(int argc, char** argv) { cout << i <<e...原创 2019-07-20 22:07:53 · 183 阅读 · 0 评论 -
初始c++(15)之c++中的初始化:“=”和“构造函数语法”
这是一个很常见的地方,但是细细品味也是很有味道 #include<iostream>using namespace std;class complex{ private: int re; int im; public: complex(int r,int i) :re(r), im(i) { }};int main(){ int i = 0; i...原创 2019-07-25 15:10:04 · 373 阅读 · 0 评论 -
初识c++(16)之c++中的读写文件(fstream)
先上代码:#include<iostream>#include<fstream>using namespace std;int main(){ string str; int n; int m; ofstream outfile("my_file.txt"); if(outfile){ outfile << "helloworld...原创 2019-07-25 20:33:45 · 375 阅读 · 0 评论 -
初识c++(18)之枚举(enum)、枚举类(enum class/struct)、枚举作为类的成员变量
enum关于枚举一些基础的认识我就不啰嗦了,这里只写我见到的比较有意思的做法。对枚举类型的讨论主要都是在作用于上。我就什么也不说都在下面的代码里:#include<iostream>using namespace std;int main(){ enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; cout <<...原创 2019-07-30 22:10:29 · 3757 阅读 · 2 评论 -
初始c++(11)之const在修饰函数、函数形参、函数返回值时的应用
const在函数中的应用时,修饰参数时放在参数前,修饰函数时放在函数后。如:const int& get_m_n(const int i) const { return i;}这理解起来很简单,但是在使用时要是需要注意一些细节的,下面是一个错误的例子:#include<iostream>using namespace std;class F...原创 2019-07-22 13:32:47 · 335 阅读 · 0 评论 -
初识c++(12)之转换函数及explicit的应用
转换函数,其实我们一直都在使用,知识没有注意到而已。比如,我们将一个int变量和double变量相加时,编译器会将int转换成double,然后再让两个double相加。那么我们是否可以将一个类对象转换成其他对象呢?答案是可以的,而且这里的其他对象既可以是int这样的内置类型,也可以是我们定义的另一个类。 先看一个例子:#include<iostream>using names...原创 2019-07-22 16:12:24 · 170 阅读 · 0 评论 -
初识c++(3)之C++中传值、传引用、传地址
传值:只是利用了原变量的值,不会对原变量有任何影响。传引用:相当于给原变量起了一个别名,原变量与新变量对应同一个值,因此对新变量的操作会影响到新变量。传地址:其实还是一种传值的操作,特殊的地方是传递的值是原变量的地址。由于这个地址指向原变量,所以通过这个地址可以改变原变量的值。传地址:#include <iostream>using namespace st...原创 2019-07-08 21:51:26 · 220 阅读 · 0 评论