木子屋 Dnawo's BLOG

分类:Win编程

共 358 篇

C++默认构造函数

代码一: 执行正确,说明编译器为我们创建了默认了构造函数(没有参数的构造函数)。 代码二: 执行正确并输出了文本,说明使用了我们自定义的默认构造函数。 代码三: 执行出错,提示缺少默认的构造函数。 代码四: 执行正确并输出文本,说明使用了我们自定义的默认构造函数。 总结 在C++中,当我们没有为类定义任何构造函数时,编译会创建默认构造函数;如果我们为类定义了一个构造函数,无论该构造函数是默认构造函数,还是非默认构造函数,编译器都不再为我们创建默认构造函数,在C#中也是这样子的。

C++程序每次运行时同一变量的内存地址都相同的解释

现象:程序每次运行时,&i的值都相同,都是0012FF44。 疑问:i属于局部变量,保存在栈中,它占据的内存是编译器自动分配和释放的,那怎么可能程序每次运行i都保存在同一地址中? 答疑:在程序运行时,程序被分配到一块内存,程序以此做为基地址,然后再在基地址上作偏移来使用内存,所以,&i实际上是一个偏移地址,它的实际地址=基地址+偏移地址。

C++参数默认值示例

说明 ·参数默认值最好在函数声明时指定; ·函数有多个参数时,当为某个参数指定了默认值时,则其后面的参数都必须指定默认值; ·调用函数时,如果为某个有默认值的参数传了值,则其前面的参数都必须传值(有默认值的也得传);

C++栈和堆的几点区别

1).存储对象不同 栈主要存储程序中的临时变量,这些临时变量包括函数的参数变量、函数内的临时变量、指针变量(指的是指针本身)、数组变量等。 堆主要存储程序中动态申请的内存块,它们通常是new运算符创建的对象。 2).分配方式不同 栈的分配和释放是由编译器完成的,无需手工实现。 堆都是由new运算符动态申请分配,再手工调用delete函数来释放的,容易产生内存泄漏。 3).增长方向不同 栈的增长方向是向下的,即向着内存地址减小的方向,是一块连续的内存区域。 堆的增长方向是向上的,即向着内存地址增加的方向,是不连续的内存区域。 4).空间大小不同 栈的增长方向是向下的,所以一般大有限制(通常是2M),因此,用户能从栈获得的空间较小,当申请的空间超过栈的剩余空间时,将提示溢出。…

C++按值/按址传递

1.按值传递: 2.按址传递: 因为C++中有了指针的概念,所以在讲述按值/按址传递函数参数比其他语言(VB使用ByRef关键字、C#使用ref关键字)好理解多了,按值传递的是副本,按址传的是内存地址。但是,使用指针,swap函数中有的变量有星号,有的变量没星号,很容易就弄混输错了,我们可以改用别名传递来实现同样的效果: swap函数的形参是实参的别名,别名等同于原本的变量,不再是副本,因而也能实现按址传递的效果,并且代码也变简单多了。

C++保存在栈和堆上的对象

说明 1.C++类中this表示的是对象指针,而不是像C#那样表示为对象; 2.保存在栈上的对象不使用了程序会自动删除,而保存在堆上的对象则不会被删除,一定要手工删除,否则可能导致内存泄漏。来看一个例子: 3.删除堆中的对象后,这只是释放了内存空间,但指针中保存的地址仍然在,指针仍可以使用,不设置为空指针可能会修改其他对象,并且难以发现和调试,再看一个例子: 执行结果: 指针stu1地址:009806C8 指针stu1地址:009806C8 指针stu2地址:009806C8 学生姓名:zhang3 Press any key to continue stu1指向的内存空间删除后又被分配给了stu2使用,由于未将stu1设置为空指针,导致stu1和stu2指针地址一样,导致使用指针stu1也可以修改新对象的内容。

C++指针

什么是指针?C++变量保存在内存中,就有一个内存地址,指针就是用来保存变量内存地址的。看下边的例子: 执行结果: 指针p1保存的内存地址:0012FF38 指针p1地址中存储的值:1982 指针p2保存的内存地址:0012FF28 指针p2地址中存储的值:abc Press any key to continue 说明 ·在变量名称前加&,就可获取到它的内存地址,如&i,&str; ·声明指针和声明变量类似,只是指针名称前多了一个星号(*); ·指针的类型要和变量类型一致,如int *p1,string *p2; ·访问指针名称将读取内存地址,访问星号+指针名称将读取地址中存储的值; ·可用const关键字声明常量指针,如int * const p1=&i;;…

C++的类

C++类示例(cls.h): 调用示例: 与C#类比较,C++的类有如下特点: ·公有成员和私有成员明显分开; ·类属性没有set和get访问器; ·公有成员允许在类定义的外面进行定义; ·类结束需要一个分号; ·inline关键字表示该函数是一个内联函数; ·const关键字表示该成员函数内不会修改任何成员变量; ·创建类实例时不需要使用new关键字;

C++的内联函数

在C++中,函数的调用会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放的内存地址中,待函数执行完后,再返回到执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,返回后先要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。特别是对于一些函数体代码不是很大,但又频繁地被调用的函数来讲,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题。 比如下边代码: 在main函数中执行echo函数时,程序需要跳转到echo函数所在的内存地址中执行,结束后再回到main函数中,这就影响到了效率,考虑函数体不大,于是我们引入了内联函数(函数定义时加inline关键字):…