C++学习中的疑问集
dzweather
https://jfchatai.cn/auth?type=register&invite=NjI4Ng
展开
-
流概念 抽取与插入
C++中流概念cout输出,又称插入,即把后面的“数据”插入进去。Cin输入,又称抽取,即把数据抽取出来。这个插入,和抽取,到底是怎么一样描述?看下图明白上面两个概念:文件就是设备的抽象叫法 缓冲就是临时存放的仓库这个图细品:大概就这意思。转载 2013-06-08 22:25:39 · 2518 阅读 · 0 评论 -
c++名字查找原则
如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。#include "stdafx.h"#include using namespace std;namespace lx1{ class Point3d { public: Point3d (double dx, double d转载 2012-10-16 21:09:01 · 798 阅读 · 0 评论 -
C++运算符重载 转换运算符
http://pcedu.pconline.com.cn/empolder/gj/c/0503/587380.html 为什么需要转换运算符? 大家知道对于内置类型的数据我们可以通过强制转换符的使用来转换数据,例如(int)2.1f;自定义类也是类型,那么自定义类的对象在很多情况下也需要支持此操作,C++提供了转换运算符重载函数,它使得自定义类对象的强转换成为可能。转载 2012-10-11 22:25:00 · 785 阅读 · 0 评论 -
观察对象构造与重载内部细节
先明确两点:1、赋值运算符和类的拷贝构造函数,对于类来说是有默认的,如果没有显式的,必要时编译器会提供这默认的函数。2、构造函数(含拷贝构造函数)是没有返回值的逐个看一下细节:class A{ int b; public: A(int m):b(m){cout<<"one arg constructor"<<endl;} void show(){cout<<b<原创 2012-10-11 18:17:21 · 827 阅读 · 0 评论 -
C++运算符重载赋值运算符
http://pcedu.pconline.com.cn/empolder/gj/c/0504/588320.html自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数。转载 2012-10-11 21:54:55 · 551 阅读 · 0 评论 -
无名对象简化运算符重载函数
http://www.pconline.com.cn/pcedu/empolder/gj/c/0503/584861.html在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的:#include using namespace std; class Test{ public: Test(int转载 2012-10-11 21:48:55 · 749 阅读 · 0 评论 -
已处理 1、预处理有啥好处?有加班费么?
按字眼,就是预先处理,但预先处理有啥好处呢?按流程编译前就应预先处理。1、在编程之前,按照#include指令所指定的那样,把头文件的内容包含在内;2、其它预处理指令可以修改或有条件地忽略某些代码;3、由编译阶段处理过的源文件是不包含预处理指令的已修改文件。这个第3是什么意思呢?20120918解答:预处理在编译前进行处理,按照宏定义进行处理后形原创 2012-08-17 11:03:08 · 824 阅读 · 0 评论 -
已处理: 预处理指令:字符相连出错
#include #include #define con(a,b) a##busing namespace std;int main(int argc, char *argv[]){ string c="my",d="home"; cout<<con(c,d)<<endl; return 0;}提示:[Error] C:\Users\bfdn\Documents原创 2012-09-18 20:36:51 · 736 阅读 · 0 评论 -
声明、定义、赋值的区别
如果是指变量的声明和定义:从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。对于下面的两句代码:void Func(){int a;int b=1;a=0;}对于第一行代码,编译器不会做任何事,它不会为它在栈中分配一点东西,直到第三句,a=0;时,编译器才会将其压入栈中。转载 2012-10-29 11:45:42 · 1892 阅读 · 0 评论 -
为什么会有临时变量?
函数传递参数过程中会有临时变量产生,为什么呢?当从一个作用域A跳到另一个作用域B时,这里A中的变量就不会在B中发生“生效”。于是把A的变量“值”交给临时变量,,再由临时变量在B中进行使用。这里临时变量相当于二传手的“作用”,好像是A中变量的作用域延伸到了B中(实质上并不是)。临时变量都是系统在控制,无须人为干预。原创 2012-10-30 10:49:54 · 922 阅读 · 0 评论 -
第十八章练习一:稀疏数组
解析:1、稀疏数组:一个数组中绝大多数元素的值都是同一个值(比如为0或者1等),只有极少部分(稀少)为相互相异的其它值。 比如a[100]数组中,有95个元素都是1,只有5个元素分别为2,3,5,7,9,那么这样的数组称为稀疏数组。因此,我们只关心极少部分的元素。2、构建一个类模板,这个模板是一个链表结构,分别装入节点的头部和尾部,节点为私有成员类,节点装入索引、数据原创 2012-11-18 20:08:04 · 770 阅读 · 0 评论 -
理解编译器的编译模板过程
原文:http://blog.csdn.net/look01/article/details/3228134如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。转载 2012-11-16 21:53:07 · 644 阅读 · 0 评论 -
为cfree5 配置舒心的编译环境
先设置一下自己的工具栏:see screen:原创 2012-11-08 11:50:03 · 5304 阅读 · 1 评论 -
已解决: 什么是内部链接,什么是外部链接?
这里并没不是讨论大学课程中所学的《编译原理》,只是写一些我自己对C++编译器及链接器的工作原理的理解和看法吧,以我的水平,还达不到讲解编译原理(这个很复杂,大学时几乎没学明白)。要明白的几个概念: 1、编译:编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CP转载 2012-11-16 20:24:16 · 2333 阅读 · 0 评论 -
未解决? 哪些是正确的?
const char* word[ ]={"he","is","boy"};char const* word[ ]={"he","is","boy"};char* const word[ ]={"he","is","boy"}; 上面哪些是正确的原创 2012-11-15 21:55:55 · 502 阅读 · 0 评论 -
已解决 类模板中分离时export产生的原因、作用和用法
查了N久的资料,很累,对于一个初学C++的忽然引入这个概念,纯粹就是一种灾难,直接打击我学习的信心和动力。幸好浪费了两天,查出以下”半解“的知识。初解:背景:export目前支持的编译很少,据介绍只有一家编译器支持(虽然它是C++标准),VC6,7是不支持的。原因:一般类模板的声明及定义都会放在一个头文件中,如果一个项目不大的情况下,是不关痛痒的。原创 2012-11-12 00:46:46 · 1849 阅读 · 0 评论 -
基类指针静态强制转为派生类指针,基类指针必须指向派生类的基类子对象????
求解,图示或用简单的例子来说明,并配详细文字解说。原创 2012-10-27 21:25:27 · 1016 阅读 · 0 评论 -
virtual意味着动态类型:引用与非引用中的差异
一个类中有virtual(即虚函数),那么它及派生的类具有动态类型。在引用时要特别小心:#include #includeusing namespace std;class A{ const char* p; public: A(const char* p1="A"):p(p1){} virtual const char* show()const{return p原创 2012-10-30 20:29:35 · 946 阅读 · 0 评论 -
链表类的熟悉
定义一个Box类,表示一个产品。然后用装车类TruckLoad来装,每个产品Box打包到到容器Package中,容器有两大要素:Box,指向下一个Package.为什么要用容器?因为不要让Box复杂,只让它代表产品。所以有了Package,容器概念是很通用的,可以以相同的方式为任何类型的对象设置窗口对象。我们明确三点:一、Box类是,内容,纯粹的内容,不带其它的链接,是一个被操原创 2012-10-05 20:52:52 · 815 阅读 · 0 评论 -
已解决! 对象的另类赋值,那么创建对象有哪些方法呢?
看一下主函数中这个对象的赋值方法:#include using std::cout;using std::endl;class A{ public: A(int m):a(m){} void show(){cout<<a<<endl;} private: int a;};int main(int argc, char *argv[]){ A a=A(3); a.s原创 2012-10-05 15:21:39 · 817 阅读 · 0 评论 -
常量的强制转换的疑惑const_cast<类型>(表达式)
下面两个编译都通过,结果不一样。void changeConst(const int * p) { int * newP = const_cast(p); *newP = 150;}int main(int argc, char *argv[]) { const int A = 50; changeConst(&A); cout << A;}结果是50.原创 2012-10-03 22:45:10 · 987 阅读 · 0 评论 -
七章练习,数组与指针的运用
#include #include #include using namespace std;int main(int argc, char *argv[]){ int **p=new int*[3];//先分配行,有3行 int i,j; for(i=0;i<3;i++) { *(p+i)=new int[6];//再每行分配6个列(元素) } for(i=0;i原创 2012-09-05 15:48:39 · 456 阅读 · 0 评论 -
C/C++数组名与指针区别深入探索
引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 想必这种误转载 2012-08-25 22:53:07 · 846 阅读 · 0 评论 -
C/C++变量在内存中的分布
原文地址:http://blog.csdn.net/morewindows/article/details/6851681C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象。先写一个测试程序:[cpp] view plaincopy#include #include转载 2012-08-22 23:11:10 · 886 阅读 · 0 评论 -
动态二维数组的分配与释放
今天在群里遇到一个询问二维数组动态申请的问题,自己想了一种办法,又在网上搜了一下,觉得下面这篇文章写得不错,特转帖如下:两种方法:1。先定义一个一维数组的类型,然后再用该类型定义一个一维数组(实际上已经成为二维的)相当于递归定义typedef int array[COL]; //使用typedef定义一个具有COL个元素的数组类型array *a; //定义二维数组,与转载 2012-09-04 16:44:08 · 921 阅读 · 0 评论 -
C/C++移位运算符出界后的结果是不可预期的
关于逻辑移位、算术移位可参见 迅雷深大笔试题部分。的一道题。以前看到C++标准上说,移位运算符(>)出界时的行为并不确定:The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left ope转载 2012-08-23 19:56:28 · 864 阅读 · 0 评论 -
c++优先级列表
原文地址:http://blog.csdn.net/xuegao007/article/details/1718660C++ Operator PrecedenceThe operators at the top of this list are evaluated first.PrecedenceOperatorDescriptio转载 2012-08-23 17:55:18 · 576 阅读 · 0 评论 -
第5章循环练习:0到49中随机选择6个不同的数。
#include #include using namespace std;int main(int argc, char *argv[]){ srand((unsigned int)(time(NULL))); int i,j,k,l,m,n; i=j=k=l=m=n=-1; unsigned int b; for(int a=0;a<6;a++) { do {原创 2012-08-29 22:34:02 · 1075 阅读 · 0 评论 -
头文件加H不加H的区别是什么?
简单的说:1、加H,是C的标准2、不加H,是C++的标准这两个文件内容是不一样的。比如里面是没有命名空间,所以一般屁股后面有using namespace std;因此,这样就造成了C和C++使用的困惑。导致C使用者在用C++又得重新学些。C++为了拉拢C的使用用户,于是又造出前加C的“怪物”,这东西是C++的东西,但重要的是它兼容前面C,所以基转载 2012-08-19 16:54:59 · 5006 阅读 · 0 评论 -
函数指针的疑问?
下面是什么意思typedef void (*pf)(void);void f(void){ pf p=&f; p(); ****f(); ********************p();}原创 2012-09-05 23:41:38 · 424 阅读 · 0 评论 -
函数的系统开销并不小:内联函数产生的原因
有时不由得怀疑为什么会有内联函数呢?直到事实发现才知道原来内联真的很节约内在。因为在调用函数时会有一些诸如保存当前地址等的系统开销。不要小看。一段小的子函数,系统开销相对于子函数本身却大多了。#include using namespace std;int* sum(){ int a=10;//栈中值,退出子函数,a消亡,但对应内存值却在 int *q=&a;原创 2012-09-06 20:35:13 · 812 阅读 · 0 评论 -
内联函数的声明和定义位置
类的成员函数一般默认为内联函数,但具体是不是按内联执行则由编译器根据函数的特性来定。下面说一下显式声明和定义类的成员为内联时的情况。1、在类内中加inline声明,在类外也加inline进行定义,编译通过。2、在类内中加inline声明,在类外不加inline进行定义,编译通过。3、在类内中加inline声明,同时进行定义,编译通过。但是原创 2012-10-02 16:58:42 · 3595 阅读 · 0 评论 -
cfree5文件标签混乱处理。
有时cfree5并不听话,文件列表标签会乱显示,非常影响心情:如上面红线内部分,怎么也处理不了。以前用cfree4安装后再安装5可以处理,但最近处理不了。琢磨了一下,发现原来解决办法很简单:一、对菜单空白处右击,弹出菜单中选择算定义二,在弹出的对话框中,把工具条的每一项全部选中,然后逐个项选中,按“重置”,这样,整个菜单和工具条就复位了。这时第一原创 2012-10-02 20:49:38 · 3228 阅读 · 1 评论 -
QuickSort快速排序,详细说明过程及展示
#include #include using namespace std;void show(int*a) //交换数据 { for(int i=0;i<8;i++) cout<<setw(3)<<a[i]; cout<<endl;}void swap(int* a,int start,int second){ int temp=*(a+start); *(a+star转载 2012-09-10 09:19:08 · 1222 阅读 · 0 评论 -
已解决:函数重载 原因:临时变量不能作为非const的引用参数传递
#include using namespace std;double sum(double a,double b){ cout<<"double"<<endl; return a+b;}long& sum(long& a,long& b){ cout<<"long"<<endl; return a;}int main(int argc, char *argv[]){原创 2012-09-07 21:52:41 · 1261 阅读 · 0 评论 -
C++从来不是赌徒,它总是立场鲜明
#include using namespace std;long sum(long a,long b){ cout<<"long"<<endl; return a+b;}double sum(double a,double b){ cout<<"double"<<endl; return a+b;}int main(int argc, char *argv[]){ l原创 2012-09-07 20:24:41 · 566 阅读 · 0 评论 -
重载、覆盖、隐藏的区别
问题的引出:#include using namespace std;template T sum(T a,T b){ return a+b;}double sum(double m,double n){ return 5.0;}int main(int argc, char *argv[]){ int a=1,b=3; cout<<sum(a,b)<<end转载 2012-09-08 18:32:51 · 657 阅读 · 0 评论 -
cfree主函数带参数时的调试办法
假定编写了一个程序,主函数带参数。我们的目的就是把第二个字符串参数,按倒序输出。#include using namespace std;int main(int argc, char *argv[]){ if(argc==2) { cout<<"argc 2"<<endl; for(int i=0;i<sizeof(argv[1])/sizeof(char)原创 2012-09-07 13:24:11 · 3247 阅读 · 2 评论 -
C/C++浮点数在内存中是怎么存储的?
任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法转载 2012-08-19 16:26:35 · 1559 阅读 · 1 评论