![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++/c总结
Denkensk
这个作者很懒,什么都没留下…
展开
-
.h头文件中的ifndef/define/endif 的作用?
防止该头文件被重复引用!原创 2015-02-28 10:52:59 · 890 阅读 · 0 评论 -
将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意事项:(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被转载 2015-02-28 11:19:20 · 822 阅读 · 0 评论 -
面向对象的三个基本特征,并简单叙述之?
1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public)2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成原创 2015-02-28 10:03:59 · 1198 阅读 · 0 评论 -
结构与联合有和区别?
(1). 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 (2). 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。原创 2015-02-28 11:00:09 · 1016 阅读 · 0 评论 -
类成员函数的重载、覆盖和隐藏区别
a.成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如转载 2015-02-28 10:47:00 · 524 阅读 · 0 评论 -
如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
以下是在论坛中看到的两种解释:(1)如果是要你的代码在编译时发现编译器类型,就判断_cplusplus或_STDC_宏,通常许多编译器还有其他编译标志宏,#ifdef __cplusplus cout#else cout#endif如果要判断已经编译的代码的编译类型,就用nm查一下输出函数符号是否和函数名相同。(相同为c,不同为c++。详转载 2015-02-28 10:42:09 · 2546 阅读 · 1 评论 -
简述数组与指针的区别
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a[] = “hello”;a[0] = ‘X’;char *p = “world”; // 注意p 指向常量字符串p[0] = ‘X’; // 编译器不能发现该错误,运行时错误(2) 用运算符sizeof 可以计算出数组的容量(字节转载 2015-02-28 10:47:54 · 581 阅读 · 0 评论 -
将“引用”作为函数参数有哪些特点?
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还转载 2015-02-28 11:17:02 · 1766 阅读 · 0 评论 -
C++内存管理
1 内存管理1.1 C++内存管理详解1.1.1 内存分配方式1.1.1.1 分配方式简介 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内转载 2015-02-28 11:23:00 · 729 阅读 · 0 评论 -
c++中虚函数和纯虚函数的作用与区别
虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。class Cman { public: virtual void Eat(){……}; void M转载 2015-03-06 21:51:43 · 659 阅读 · 0 评论 -
c与c++中struct区别
这里有两种情况下的区别。(1)C的struct与C++的class的区别。(2)C++中的struct和class的区别。 在第一种情况下,struct与class有着非常明显的区别。C是一种过程化的语言,struct只是作为一种复杂数据类型定义,struct中只能定义成员变量,不能定义成员函数(在纯粹的C语言中,struct不能定义成员函数,只能定义变量)。例如下面的C代码转载 2015-03-06 21:56:33 · 371 阅读 · 0 评论 -
C++中引用和指针的区别
(1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值. String & rs = string1; 由于没有所谓的 null reference 所以所以在使用前不需要进行测试其是否有值.,而转载 2015-02-28 09:29:01 · 464 阅读 · 0 评论 -
main函数执行前后
全局对象的构造函数会在main 函数之前执行,为malloc分配必要的资源等等。原创 2015-02-28 10:18:54 · 498 阅读 · 0 评论 -
static在c和c++中的用法和区别
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)第一个作用:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容#include增加这条语句char a = ‘A‘; // global var原创 2015-02-28 08:43:46 · 555 阅读 · 0 评论 -
C++深浅拷贝浅析
浅拷贝是创建了一个对象用一个现成的对象初始化它的时候只是复制了成员(简单赋值)而没有拷贝分配给成员的资源(如给其指针变量成员分配了动态内存); 深拷贝是当一个对象创建时,如果分配了资源,就需要定义自己的拷贝构造函数,使之不但拷贝成员也拷贝分配给它的资源。 C++中深拷贝和浅拷贝的问题是很值得我们注意的知识点,如果编程中不注意,可能会出现疏忽,导致bug。本文就详细讲讲C转载 2015-03-09 20:56:41 · 547 阅读 · 0 评论 -
C++中虚析构函数的作用
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类:class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout "Do转载 2015-03-11 12:41:18 · 448 阅读 · 0 评论 -
基类的析构函数不是虚函数,会带来什么问题?
派生类的析构函数用不上,会造成资源的泄漏。原创 2015-02-28 11:01:55 · 2146 阅读 · 0 评论 -
分别写出BOOL,int,float,指针类型的变量a与“零”的比较语句
BOOL : if ( !a ) or if(a)int : if ( a == 0)float : const EXPRESSION EXP = 0.000001 if ( a -EXP)pointer : if ( a != NULL) or if(a == NULL)不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“EPSI原创 2015-02-28 10:23:18 · 6997 阅读 · 0 评论 -
c++中的 extern "C"
比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL 输出(Export) 的函数,你需要用extern "C" 来强制编译器不要修改你的函数名。通常,在C 语言的头文件中经常可以看到类似下面这种形式的代码:#ifdef __cplusplusextern "C" {#endif/**** some declaration or so *****/转载 2015-02-28 09:44:36 · 322 阅读 · 0 评论 -
strcpy和strlen功能实现
已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。/*编写strcpy函数(10分)已知strcpy函数的原型是 char *strcpy(char *strDest, const c原创 2015-02-28 10:00:38 · 531 阅读 · 0 评论 -
C++是不是类型安全的?
不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。原创 2015-02-28 10:15:30 · 1652 阅读 · 1 评论 -
C与C++各自是如何定义常量的?
C中是使用宏#define定义, C++使用更好的const来定义。区别: 1)const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查,而且在字符替换时可能会产生意料不到的错误(边际效应)。 2)有些编译器可以对const常量进行调试, 不能对宏调试。原创 2015-02-28 09:24:51 · 1080 阅读 · 0 评论 -
struct 和 class 的区别
struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。 从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服 务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计原创 2015-02-28 10:13:33 · 396 阅读 · 0 评论 -
当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。
肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。转载 2015-02-28 10:51:40 · 2044 阅读 · 0 评论 -
在什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;例1int a ;const int &ra=a;ra=1; //错误a=1; //正确例2string foo( );void bar(string & s);那么下面的表达式将是非法的:b转载 2015-02-28 11:18:27 · 914 阅读 · 0 评论 -
#include<a.h>和#include"a.h"的区别
对于#include ,编译器从标准库路径开始搜索 a.h对于#include "a.h" ,编译器从用户的工作路径开始搜索 a.h原创 2015-02-28 09:36:23 · 1144 阅读 · 0 评论 -
String类
String类定义:class String{public: String(const char *str = NULL); // 通用构造函数 String(const String &another); // 拷贝构造函数 ~String(); // 析构函数 String& operater =(const String &rhs); // 赋值函数private原创 2015-02-28 10:02:22 · 273 阅读 · 0 评论 -
子类析构时要调用父类的析构函数吗?
析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了。定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。转载 2015-02-28 10:59:08 · 6685 阅读 · 3 评论 -
全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。原创 2015-02-28 11:02:18 · 1944 阅读 · 0 评论 -
什么是“引用”?申明和使用“引用”要注意哪些问题?
引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数原创 2015-02-28 11:16:25 · 674 阅读 · 0 评论 -
c++中const的作用
const关键字至少有下列n个作用:(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为T原创 2015-02-28 08:50:13 · 464 阅读 · 0 评论 -
动态特性
在绝大多数情况下, 程序的功能是在编译的时候就确定下来的, 我们称之为静态特性。 反之, 如果程序的功能是在运行时刻才能确定下来的, 则称之为动态特性。C++中, 虚函数,抽象基类, 动态绑定和多态构成了出色的动态特性。原创 2015-02-28 09:53:53 · 605 阅读 · 0 评论 -
如何打印出当前源文件的文件名以及源文件的当前行号?
cout cout__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的原创 2015-02-28 10:45:16 · 1340 阅读 · 0 评论 -
c++模板声明和定义编译过程的分析
c++模板声明和定义编译过程的分析原创 2015-04-27 16:15:18 · 982 阅读 · 0 评论