![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++学习
Strive--顾
一日之计在于晨,一生之计在于勤。
展开
-
lib 和 dll 的区别、生成以及使用详解
https://www.cnblogs.com/TenosDoIt/p/3203137.html原创 2020-06-23 10:00:48 · 272 阅读 · 0 评论 -
Visual Studio 2015开发Qt项目实战经验分享
Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)上面的作者博客内容写的不错 推荐大家看一看 避免走弯路原创 2019-12-26 09:15:27 · 411 阅读 · 0 评论 -
论C++11 中vector的N种遍历方法
随着C++11标准的出现,C++标准添加了许多有用的特性,C++代码的写法也有比较多的变化。vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法。(注:本文中代码为C++11标准的代码,需要在较新的编译器中编译运行)假设有这样一个vector:(注意,这种列表初始化的方法是c++11中新增语法)vector<int> valLis...原创 2019-11-12 13:59:09 · 1617 阅读 · 0 评论 -
C++中的空类默认产生的类成员函数
对于一个C++的空类:比如Empty:1 class Empty2 {3 } ; 虽然Empty类定义中没有任何成员,但为了进行一些默认的操作,编译器会加入以下一些成员函数,这些成员函数使得类的对象拥有一些通用的功能》(1)默认构造函数和复制构造函数。他们被用于类的对象的构造过程。(2)析构函数。它被用于类的对象的析构过程。(3)赋值原创 2017-06-05 23:39:37 · 630 阅读 · 0 评论 -
指针和引用的区别
(1)初始化要求不同。引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值。(2)可修改性不同。引用一旦被初始化为指向一个对象,它就不能改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象。给引用赋值并不是改变它和原始对象的绑定关系。(3)不存在NULL引用,引用不能使用指向空值的引用,它必须总是指向某个对象;而指原创 2017-04-16 00:15:20 · 345 阅读 · 0 评论 -
函数指针与指针函数的区别
(1)指针函数是指带指针的函数,即本质是一个函数,并且返回类型是某一类型的指针。 定义:返回类型标识符 * 返回名称(形式参数表){函数体} 事实上,每一个函数,即使他不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。原创 2017-04-27 22:05:01 · 294 阅读 · 2 评论 -
this指针的使用
下面是一段关于this指针的代码,可以自己先想想输出的结果是什么,如果取消第14行的注释,输出的又是什么?#include using namespace std ;class myclass{public: int data ; myclass(int data ) { this -> data ; } void print() { //cou原创 2017-04-24 22:32:27 · 290 阅读 · 0 评论 -
C语言的内存管理
对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text)、数据段(.data)、BSS段(.bss),堆和栈组成,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和栈是程序运行的时候由系统分配的。布局如下 在上图中,由编译器分配的地址空间都是在连接的时候分配的,而运行时分配的空间是在程序运行时由系统分配的 BSS段转载 2017-05-28 00:29:32 · 276 阅读 · 0 评论 -
归并排序算法原理分析与代码实现
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表。 归并排序基本原理通过对若干个有序结点序列的归并来实现排序。所谓归并是指将若干个已排好序的部分合并成一个有序的部分。归并排序基本思想设两个有转载 2017-05-16 20:32:13 · 368 阅读 · 0 评论 -
编程实现库函数strcat
库函数strcat是把一个字符串内容连接到目标字符串的后面,所以应该从目标字符串的末尾,也就是结束符‘\0’的位置插入另一个字符串的内容,下面是实现的代码:#include #include char*mystrcat(char *dest,const char * src){ char *ret ; ret = dest ; //保存目的字符串首地址以便返回 while(*原创 2017-05-14 23:34:36 · 1099 阅读 · 0 评论 -
构造函数的使用
在C++中,我们一般会利用构造函数来初始化类里面的成员函数,先看下面一段代码,可以自己先考虑输出语句会不会是0?#include using namespace std;struct CLS{ int m_i ; CLS(int i) : m_i(i){} CLS() { CLS(0) ; }};int main(){ CLS obj ; cout<<obj原创 2017-06-06 15:47:46 · 438 阅读 · 0 评论 -
explicit构造函数的作用
explicit构造函数是用来防止隐式转换的。看下面一段代码:class Test1{public: Test1(int n){num = n ;}; //普通构造函数private: int num ;};class Test2{public: explicit Test2(int n ){num = n ;} //explicit(显示)构造函数private:原创 2017-06-07 13:33:16 · 1177 阅读 · 0 评论 -
C++的运算符重载
C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作转载 2017-06-30 14:43:49 · 223 阅读 · 0 评论 -
编写类String的构造函数、析构函数和赋值函数
已知类String的原型为:class String{public: String(const char *str = NULL) ; //普通构造函数 String(const String &other) ; //复制构造函数 ~String(void) ; //析构函数 String & operator = (const String &other原创 2017-06-10 20:04:08 · 688 阅读 · 0 评论 -
C++多态的实现原理
1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。3. 多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。4. 多态用虚函数来实现,结合动态绑定。5. 纯虚函数是虚函数再加上= 0。6. 抽象类是指包转载 2017-07-16 19:46:49 · 215 阅读 · 0 评论 -
c语言中使用goto语句
goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。不过要是遇到goto语句我们得要知道是什么意思。 举两个例子吧:原创 2017-07-25 21:00:56 · 1580 阅读 · 0 评论 -
C++智能指针及其简单实现
使用智能指针的缘由 1. 考虑下边的简单代码:1 int main()2 {3 int *ptr = new int(0);4 return 0;5 } 就如上边程序,我们有可能一不小心就忘了释放掉已不再使用的内存,从而导致资源泄漏(resoure leak,在这里也就是内存泄漏)。 2. 考虑另一简单代码:1 int转载 2017-09-27 11:05:57 · 290 阅读 · 0 评论 -
VC++直接操作使用C#类库基本操作
VC++ 直接操作使用 C# 类库基本操作: C# 简单易操作,而且有比较丰富的类库, 方便处理各种情况,比如来说处理字符串,我觉得用 C# 就比较的方便,或者是用 java 之类的,用 C++ 处理起来感觉比较繁琐,所以在用 VC 进行编程的时候放着 C# 不用感觉蛮可惜,好了,废话不多说,进入正题!开发环境: VS2005 , VC++项目: VC++ M原创 2017-11-29 16:53:23 · 1928 阅读 · 0 评论 -
VS2010-MSDN的安装使用及在线网址
VS2010MSDN的使用简介:点击打开链接 VS2010在线查看MSDN: 点击打开链接原创 2017-12-19 10:33:54 · 858 阅读 · 0 评论 -
C++封装继承多态总结
面向对象的三个基本特征面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!封装转载 2017-08-01 22:26:18 · 441 阅读 · 0 评论 -
编程实现strcmp库函数
实现C/C++库函数中的strcmp,即对于两个字符串str1和str2,若相等,则返回0,若str1大于str2,则返回1,若str1小于str2,则返回-1。下面是一段实现代码:#include using namespace std ;int mystrcmp(const char *src ,const char *dst){ int ret = 0 ; while(!(ret原创 2017-05-14 23:21:08 · 914 阅读 · 0 评论 -
编程判断字符串是否为回文
判断一个字符串是否为回文,比如说单词“level”就是回文。我们可以从一个字符串的两端进行遍历比较,例如对于level我们可以进行下面的步骤。(1)计算需要比较的次数。由于“level”字符串长度为5,是奇数,因此比较两次(2)第一次比较:看“level”的第一个字符与最后一个字符是否相等,若相等,则进行第二次比较。(3)第二次比较:看“level”的第二个字符与倒数第二个字符是否相等原创 2017-05-13 22:04:26 · 6811 阅读 · 0 评论 -
使用sizeof计算虚继承的类对象的空间大小
#include using namespace std; class A {};class B{};class C:public A,public B{};class D:virtual public A{};class E:virtual public A,virtual public B{};class F{public: int原创 2017-04-06 15:33:53 · 372 阅读 · 0 评论 -
变量引用
#include const float pi = 3.14f ;float f ;float f1(float r){ f = r*r*pi ; return f ;}float& f2(float r){ f = r*r*pi ; return f ;}int main(){ float f1(float = 5) ; float& f2(floa原创 2017-04-14 23:21:36 · 400 阅读 · 0 评论 -
找错——const的使用
const作为c和c++重要的关键词之一,经常会让我们对于const修饰的变量的值是否改变,能否改变而产生疑惑,下面是一段有关const使用的程序,可以先自己试着找找错误(编译不会通过):1 #include 2 3 int main()4 {5 const int x ;6 int b = 10 ;7 int c = 20 ;89 const int *原创 2017-03-24 21:40:37 · 286 阅读 · 0 评论 -
编程风格良好的条件比较语句
编写程序时,良好的编程风格很重要,下面是不同方式的条件比教语句的对比:A.假设布尔变量名字为flag,它与零值比较的标准if语句如下: (1)1. if(flag == TRUE) 2. if(flag == FALSE) (2)1. if(flag) 2. if(!falg) A的第二种风格较良原创 2017-03-22 13:49:19 · 414 阅读 · 0 评论 -
看代码写结果——C++类的静态成员
说到关键字static,大家肯定都不会陌生,在c和c++中,static的重要性不言而喻,需要我们牢牢记住其注意点和用法。 首先在c语言中,static有三个明显的作用:(1)在函数体,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变。(2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有的函数访问,但不能被模块外其他函数访问。它是一个本地的全局变量。(原创 2017-03-26 23:00:17 · 362 阅读 · 0 评论 -
有了malloc/free,为什么还要new/delete
malloc与free是C++/C的标准库函数,new/delete是C++的运算符。他们都可以用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在销往之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强原创 2017-04-28 21:40:20 · 487 阅读 · 0 评论 -
回调函数
回调函数通俗的解释: 普通函数:你所写的函数调用系统函数,你只管调用,不管实现。 回调函数:系统调用你所写的函数,你只管实现,不管调用。形象的比喻下吧:你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话原创 2017-04-12 18:35:22 · 731 阅读 · 0 评论 -
内联函数
为什么要引入内联函数: 引入内联函数的主要目的是,用它替代c语言中表达式形式的宏定义来解决程序中函数调用的效率问题,在c语言里可以使用如下的宏定义:#define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2) 这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈、代码生成等一系列的操作,因此效率更高原创 2017-04-10 23:13:09 · 455 阅读 · 1 评论 -
如何获取文件的绝对路径
我们写代码时常常会碰到需要用到获取文件的路径的时候,但是总不能直接赋值,如果文件换了位置那路径也需要自己手动去修改,操作不够方便。在C++中并没有类似功能的封装好的函数提供,所以需要我们自己去写一个函数,下面是能实现该需求的函数:1. 函数原型: DWORD GetModuleFileName( HMODULE hModule,原创 2017-05-01 22:59:50 · 6622 阅读 · 0 评论 -
使用库函数将字符串和数字互换
一:数字转换为字符串(1)itoa():将整型值转换为字符串(2)ltoa():将长整型值转换为字符串(3)ultoa():将无符号长整型值转换为字符串(4)gcvt():将浮点型数转换为字符串,取四舍五入(5)ecvt():将双精度浮点型值转换为字符串(6)fcvt():以指定位数为转换精度,其余同ecvt()还可以使用sprintf系列函数把数字转换成字符串,这种方原创 2017-05-10 22:20:59 · 425 阅读 · 0 评论 -
new一个类的指针(不同括号的区别)
括号分为两种,中括号[]或小括号()。为方便说明,定义指针类型为class test, 指针为test *ptest;一、 中括号的情况。中括号是用来标示申请的是一个对象,还是一组对象。1 没有中括号时,即ptest = new test; 这时ptest得到的是一个对象*ptest, 释放时使用delete ptest;2 带有中括号时,在中括号中需要有一个正整数参数。ptest = new t原创 2017-04-20 14:48:41 · 3460 阅读 · 0 评论 -
什么是句柄?指针和句柄的区别
句柄在windows编程中是一个很重要的概念,在许多地方都扮演着重要的角色。在windows环境中,句柄是用来标识项目的,这些项目包括:(1)模块(module)(2)任务(task)(3)实例(instance)(4)文件(file)(5)内存块(block of memory)(6)菜单(menu)(7)控制(control)(8)字体(font)(9)资源原创 2017-05-04 23:20:58 · 31297 阅读 · 3 评论 -
动态内存的传递
先看如下一段代码:#include using namespace std ;void Getmemory(char* p ,int num){ p = (char*)malloc(sizeof(char)*num) ;}int main(){ char *str = NULL ; Getmemory(str,10) ; strcpy(str,"hello") ;原创 2017-05-04 22:43:18 · 433 阅读 · 0 评论 -
编程实现字符串中子串的查找
写一个函数,实现strstr,即从一个字符串中,查找另一个字符串的位置,如:strstr("12345","34")返回值为2,在2号位置找到字符串34。代码如下:#include #include const char *strstr(const char * src,const char * sub){ const char * bp ; const char * sp ;原创 2017-05-12 19:52:01 · 4737 阅读 · 1 评论 -
编程实现计算字符串的长度
我们知道字符串是以'\0'作为结束符的,所以只需要做一次遍历就可以了。但是需要注意的是,要尽量把程序写的简单且效率高,下面是示例代码:#include #include int strlen1(const char * src){ assert(NULL != src) ; //src必须有效 int len = 0 ; //保存src的长度 whil原创 2017-05-12 19:23:02 · 2802 阅读 · 0 评论 -
编程实现strcpy和memcpy函数
首先需要了解strcpy与memcpy的区别:(1)两者复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组,整型,结构体,类等(2)复制的方法不同。strcpy不需要指定长度,它是遇到字符串结束符‘\0’而结束的。memcpy则是根据其第三个参数决定复制长度的。(3)用途不同。通常在复制字符串时用strcpy;而若需要复制其他类型的数据,则一般用m原创 2017-05-11 15:31:44 · 617 阅读 · 0 评论 -
指针常量和常量指针
指针的知识重点很多,常量指针和指针常量在程序中会经常出现,并经常会让人误解。(1)常量指针:表述为“是常量的指针”,它首先应该是一个指针。(2)指针常量:表述为“是指针的常量”,它首先应该是一个常量。 常量指针,它是一个指向常量的指针。设置常量指针指向一个常量,为的就是防止写程序过程中对指针误操作出现了修改常量这样的错误,编译系统就会提示我们出错信息。因此,常量指针就是指原创 2017-04-17 15:49:21 · 380 阅读 · 0 评论 -
指针的加减操作和比较
指针加减的例题代码:#includeint main(void){ int a[5] = {1,2,3,4,5} ; int *ptr = (int *)(&a+1) ; printf("%d\n",*(a+1)) ; printf("%d\n",*(ptr-1)) ; return 0 ; }解析: 这里主要是关于指针加减操作的理解。原创 2017-04-16 22:59:04 · 1342 阅读 · 0 评论