C/C++
C++,令人着迷的语言
喜欢吃冰棍de谷利文君
日拱一卒,功不唐捐
展开
-
【C++知否】类的静态成员
静态成员可以是private,public,protected的。静态数据成员的类型可以是常量、引用、指针、类类型的。静态成员的类内初始化通常情况下,类的静态成员不应该在类的内部初始化。但是,我们可以为静态成员提供const整数类型的类内初始值。不过要求静态成员函数必须是字面值常量类型constexpr。初始值必须是常量表达式,因为这些成员本身就是常量表达式,所以它们能在所有适合常量表达式的地方。即使一个常量静态数据成员在类内部被初始化了,通常情况下在类的外部也应该定义一下该成员。静态数原创 2020-07-17 21:34:53 · 221 阅读 · 0 评论 -
sizeof用法
声明:1)C中sizeof用法 <<<这篇博客分析的比较详细,我仅仅是记录一些关键点,便于自己查阅。1)作用sizeof操作符以字节形式给出其操作数的存储大小。操作数可以是一个表达式 或 括在括号内的类型名。2)用法用于数据类型sizeof(type),数据类型必须用括号括起来。用于变量sizeof(var_name),可以不用括号。注意,不能用于void。3)注意规则(1)常见的数据类型char、unsigned char、signed char.转载 2020-06-25 11:05:10 · 395 阅读 · 0 评论 -
【时间复杂度分析】将N个元素使用push_back插入到vector中, 求push_back操作的复杂度
转自:问题: 将N个元素使用push_back插入到vector中, 求push_back操作的复杂度。参考:C++ std::vector中push_back操作时间复杂度分析分析如下:考虑vector每次内存扩充两倍的情况:如果我们插入N个元素,则会引发lgN次的内存扩充,而每次扩充引起的元素拷贝次数为20,21,22,...,2lgN.2^0, 2^1, 2^2,...,2^{lgN}.20,21,22,...,2lgN.为什么是lgN次的内存扩充?如下表所示:元素个数转载 2020-06-12 09:55:31 · 949 阅读 · 0 评论 -
【C++知否】函数不能返回数组,但可以返回数组指针
虽然知道函数不能返回数组,之前都是使用引用或者形参传入的数组地址,直接修改,函数返回时就不需要考虑返回数组。这几天看到函数返回值这一章节,感觉也需要掌握返回数组指针这一方法。因为数组不能被拷贝,所以函数不能返回数组。但是可以返回数组的指针或引用。解决方法:使用类型别名,定义数组的指针或者引用。typedef int arrT[10];//arrT是一个类型别名,表示的类型是含有10个整数的数组。using arrT=int[10];//类型别名的等价声明arrT* func(int i);//原创 2020-05-16 22:18:10 · 1252 阅读 · 0 评论 -
C++ 类型转换
C++的四种类型转换:1 static_cast用于内置的数据类型,还具有继承关系的指针或引用。【注意】:若是内置数据类型指针,如int*、char*,或者没有继承关系的对象指针,都不能用static_cast。//转换具有继承关系的对象指针//父类指针转换成子类指针(不安全)Animal *ani=nullptr;Cat *cat=static_cast<Cat*&g...原创 2020-05-02 14:57:57 · 118 阅读 · 0 评论 -
C/C++中【全局变量赋值】引发的错误
今天发现一个奇怪的现象:变量a 、p是全局变量,声明在main函数之外;指针p在定义时没有初始化,而是通过后面的赋值。如图,出现错误了:错误提示:但是将这些变量放置在main函数之中,就没有错误了:注意,上面的问题不仅仅是针对指针的,任何变量在都会出现这种错误。原因:C语言中不允许在函数外部给全局变量赋值,全局变量在函数外只能定义时初始化。解决方法:1)在定义全局变...原创 2020-04-10 17:16:58 · 3333 阅读 · 0 评论 -
C/C++中单引号与双引号使用
一直使用单引号和双引号,在Python中好像没有很强的使用限定,但是看到C++中两者的使用有些不同。参考:Single quotes vs. double quotes in C or C++In C and in C++ single quotes identify a single character, while double quotes create a string liter...原创 2020-03-28 15:19:17 · 3475 阅读 · 0 评论 -
【C++知否】 引用和指针的区别
引用和指针的区别:1)指针有自己的一块空间,而引用只是一个别名;2)使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;3)指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用;4)作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象;5)可以有const指针,但是没有const引用;6)指针在使用中可以指向...原创 2020-03-27 23:23:41 · 102 阅读 · 0 评论 -
【C++知否】 C++中static关键字的作用
static关键字的作用:1)全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);作用域:全局静态静态变量在声明它的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。2)局部静态变量在局部变量之前加上关键字sta...原创 2020-03-27 21:44:41 · 162 阅读 · 0 评论 -
C++ 杂记1
1 在C++种main函数前面为什么要加上数据类型,比如int、void?main函数的返回值时返回给主调进程,使主调进程得知被调用程序的运行结果。标准规范种规定main函数的返回值为int,一般约定返回0值代表程序无错误,其他值均为错误号,但该约定并非强制。如果程序的运行结果不需要返回给主调进程,或程序开发人员确认该状态并不重要,比如所有出错信息均在程序中有明确提示的情况下,可以不写mai...原创 2020-03-08 23:33:12 · 128 阅读 · 0 评论 -
Linux下编译运行多个C++文件
之前一直使用集成开发环境,如VS、CLion等(CLion比较人性化,最爱它的调试功能,可以在程序中看到当前的变量值,推荐)。但是既然走C++这条路,就要了解Linux下的C++编程,所以学习了一下。在面临多个文件需要同时编译运行的情况,就需要借助makefile了。在网上看了很多博客,看了半天,终于,终于成功了!但是有好多只是列举了一些参数功能,有些讨论的过于高深,不适合我这种刚入门的小...原创 2020-03-03 22:50:32 · 3092 阅读 · 0 评论 -
【蚕食C++】 C++模板
模板的使用比较频繁,所以这里总结一下,后面有新的收获会及时更新。1 模板概述模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。2 模板格式//函数模板template <class type> ret-type func-name(paramter list){ //函数的主体}//在这里,type是函数...原创 2020-03-02 11:20:02 · 90 阅读 · 0 评论 -
【蚕食C++】 静态联编和动态联编
1、联编是指一个程序模块、代码之间相关联的过程;2、静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配。重载函数使用静态联编。3、动态联编,是指程序联编推迟到运行时进行,所以又称为晚期联编(迟绑定)。switch语句和if语句是动态联编的例子。4、C++与C相同,是静态编译型语言。5、在编译时,编译器自动根据指针的类型判断指向的是一个什么样的对象;所以编译器认为父类指针指向的是...原创 2020-03-02 10:53:38 · 195 阅读 · 0 评论 -
【蚕食C++】 重写、重载、重定义
1、重载一定是同一个作用域下;如果是在全局下,写了两个函数,就不是重载。2、重定义发生在两个不同的类中,一个是子类,一个是父类。3、重写虚函数重写;父类是一个虚函数。归结:1)普通函数重定义。如果父类的普通成员函数,被子类重写,说是重定义。2)虚函数重写。如果父类的虚函数,被子类重写,就是虚函数重写,这个函数会发生多态。...原创 2020-03-02 10:51:42 · 226 阅读 · 0 评论 -
【C++知否】 const关键字
【注意】:原创 2020-03-02 10:47:45 · 111 阅读 · 0 评论 -
【C++知否】 继承和派生
1 继承与派生//情况一://类B拥有类A的成员变量,B has A,类B 依赖于 类Aclass B{public: void funcB(){ } A a;};//情况二://类C 的成员方法 需要类A的形参, C use A,类C 依赖于 类Aclass C{public: void funC(A *a){ }}//情况三://D继承于A 类D 如果...原创 2020-03-02 10:42:32 · 136 阅读 · 0 评论 -
【C++知否】 友元函数
1 友元采用类的机制后实现了数据的隐藏于封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是有时候需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类地数据成员,这时候可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等需要时间开销),但它破坏...原创 2020-03-02 10:39:26 · 185 阅读 · 0 评论 -
【C++知否】 this指针
原创 2020-03-02 10:32:29 · 113 阅读 · 0 评论 -
【C++知否】 malloc与new的区别
1 malloc与new的区别?2 static静态成员原创 2020-03-02 10:30:12 · 121 阅读 · 0 评论 -
【C++知否】构造函数&析构函数
为什么需要构造函数?面向对象的思想,生活中存在的对象都是被初始化后入世的,初始状态是对象普遍存在的一个状态。当设计一个类时,如果类的内部声明了某些变量,但是没有赋值,当创建这个类的对象时,已经将这些变量的空间开辟出来了,但这些没有正确数据的变量空间是危险的。我们要想给这些变量赋值只能通过init()方法,把具体的值传进去。然而,在下图中的位置,这段时间内,这个变量空间依然是危险的。如果是开...原创 2020-03-02 10:22:55 · 183 阅读 · 0 评论 -
【C++知否】类
1 成员函数成员函数有时称为方法。使用点运算符 .来表达我们需要的成员,点运算符只能用于类类型的对象。使用调用运算符()来调用一个函数,括号里面放置实参列表,可能为空。2 封装的访问属性protected在类的继承中跟private有区别,在单个类中,跟private是一样的。strut中所有行为和属性都是public的。C++中的class可以指定行为和属性的封装方式,默认的访问控...原创 2020-03-02 09:17:34 · 394 阅读 · 0 评论 -
Linux下编译运行C++程序
系统:Ubuntu编译器:g++执行流程如下图:步骤:1)创建文件,后缀名设置为.cpp;touch test.cpp2)使用vim编写C++程序; #include <iostream> using namespace std; #define max 1024 int main(){ cout<<max<<endl;...原创 2020-02-27 20:24:03 · 715 阅读 · 0 评论 -
重载左移运算符,出现error: 'ostream' does not name a type
当需要对我们自己实现的类进行遍历操作时,想到达到cout<<的效果,就需要重载左移运算符。比如: MyArray array3(20); array3=array1;//重载了 =(赋值操作符),使用array1对array3进行赋值 cout<<"array3"<<endl; for(int i=0;i<array3.getLen();i++)...原创 2020-02-26 10:55:27 · 4267 阅读 · 0 评论 -
【C++知否】 函数重载
一、函数类型包含哪些因素?函数指针包括:函数的返回值,函数形参列表(参数的个数,参数的类型,参数顺序)。【因此,如果函数的返回值,函数形参列表相同,那么两个函数就是相同的。】注意:如果在C语言中,只要函数名相同,就认为是重新定义,就会报错。但是C++不同,C++有函数重载,所以不会报错。函数重载:函数名相同,参数列表不同。【定义:用同一个函数名定义不同的函数,当函数名和不同的参数...原创 2020-02-24 18:10:22 · 197 阅读 · 0 评论 -
【C++知否】 内联函数
由于Markdown编辑颜色注释比较麻烦,其次我平时使用OneNote记录,所以直接使用的OneNote格式的图片。原创 2020-02-24 18:08:25 · 128 阅读 · 0 评论 -
【C++知否】 引用
一、引用引用可以理解为一个变量的别名。int &re=a; //int & 使用引用数据类型,re就是a的别名1)引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。2)声明的时候必须初始化,一经声明,不可更改。3)可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。4)&am...原创 2020-02-24 18:03:46 · 126 阅读 · 0 评论 -
【蚕食C++】C++相对于C的增强
C++相对于C的增强C++对全局变量的定义检测能力增强了;C++定义一个变量,可以随用随定义;struct类型增强c语言的struct定义了一组变量的集合,c编译器并不认为这是一种新的类型;c++中的struct是一个新类型的定义声明。三目运算符C语言中,关于三目运算符,不可以作为左值使用,除非使用地址。C++中,三目运算符,可以当左值,实际上返回的是引用。...原创 2020-02-22 19:36:48 · 160 阅读 · 0 评论 -
【C++知否】 命名空间
//定义一个命名空间namespace spcaeA{ int a=10}【注意】:1)命名空间没有分号2)spcaeA是空间名使用命名空间中的变量时,有以下几种方式:1)using spaceA::a;2)using namespace spcaeA;...原创 2020-02-22 17:58:10 · 149 阅读 · 1 评论 -
【C++知否】 C++存储示意图
经常用到c++内存的问题,但是总是搞不清楚内存分配的关系和位置区间,所以整理一下,方便下次复习查阅。如有错误,欢迎指正!########################################################操作的内存可以分为以下几部分:1)栈区stack由编译器自动分配和释放,存放函数的参数值、局部变量等值,其操作方式类似于数据结构中的栈。2)堆区heap...原创 2020-02-22 14:25:17 · 508 阅读 · 0 评论 -
C++中的assert用法
assert用法void assert(int expression);C++中assert,即断言,可以在程序调试阶段检查错误,常用的就比如函数传参时,若是整型,是否超出范围;若是字符串型,地址是否为空等。在正常时,程序可以照常执行,如果出现超过范围或空地址时,就可以报错提示。这里的提示是我们写入assert的参数表达式,只不过assert将这个表达式发送给了标准输出文件。assert...原创 2019-11-26 10:56:49 · 20967 阅读 · 0 评论 -
VS2015中成员运算符( . )自动判断替换为( -> )
在使用VS2015编写C++程序,每次通过指针访问结构的成员时,都需要手动打出->,效率很低,习惯了Qt中.运算符自动判断是否需要切换到->运算符。所以查看了VS的配置。操作如下:工具 -> 选项 -> 文本编辑器 -> C/C++ -> 实验将图中的第一个选项启用成员列表的点到箭头替换,设置为True。可以看到下面的说明:当适用于成员列表时,将"...原创 2019-10-20 21:38:20 · 1344 阅读 · 2 评论 -
VS2015错误 LNK1561:必须定义入口点
错误如下:解释一下入口点,每个应用程序(文件格式为exe)都应该有个启动点,这个点就是main函数。缺少就会出现link error 。所以解决方法就有方向了,查看程序发现main函数名打错了,写成了”mian“,初级错误啊,哎~ ...原创 2018-11-16 14:36:31 · 9015 阅读 · 2 评论