1,关于C中的引用用法不同编译器对C++的标准实现是不一样的,以G++为准 。TC3很不规范 , 连throw都没有构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表 , 每个数据成员后面跟一个放在括号中的初始化式 。例如:example::example() : ival(0), dval(0.0) 上面的例子和下面不用初始化列表的构造函数看似没什么区别:example::example()ival = 0;dval = 0.0;}的确,这两个构造函数的结果是一样的 。但区别在于:上面的构造函数(使用初始化列表的构造函数)显示的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显示的初始化 。初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以 。但有的时候必须用带有初始化列表的构造函数:(1)成员类型是没有默认构造函数的类 。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败 。(2)const成员或引用类型的成员 。因为const对象或引用类型只能初始化,不能对他们赋值 。
2 , 请教c中引用和指针的用法引用 , 如在C++中:int a=0;int&b=a;a 是一个存储空间的名字 , 叫变量 。b就是引用 。是a的一个别名 , 就像是一个人的曾用名一样 , 一个人有几个名字 。b不另辟存储空间 。如有:b=a;这里的b就是要另辟存储空间的 。
3 , 关于C的参数引用用法&在c语言中有取地址的意思,但在c++中增加了引用的意思,“引用” 。(1)void a(b &)只有在函数声明中才可以省略形参名,这是c的规定; (2)引用在c++中的作用是传引用时,在函数中使用时,就直接传的是实参,不用在函数体内去构 造实参的一个副本,这样提高了效率 , 因此也达成了直接修改实参的目的; (3)引用还可以用于给函数返回多个返回值 , 比如栈的出栈函数,可以这样设计,返回值为bool类 型,判断是否出栈成功(栈空时返回false),另外可以传递引用型实参用于接收出栈元素 。希望可以帮到你 , 不懂可以追问!第一个地方必须用引用的原因:该函数体内修改了参数s的成员,因此不能用传值,否则,修改的就是函数的形参(实参的副本),对实参没有任何影响第二个地方可以传值的原因:该函数体内没有修改形参s的成员 , 只是读取出来了,从程序的结果而言,不管是原始对象还是其副本 , 都没有影响 。附注:1..第二个地方最好使用常引用做形参 void copy(const sample &s),既有引用的高效(不用复制副本),又有传值的安全性(函数体内不能修改该参数)2.如果是复制构造函数,则不能传值,不然导致无穷递归【c 引用的用法,关于C中的引用用法】
4 , C的指针有几种用法引用有几种用法在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式?void func1( MYCLASS *&pBuildingElement );论坛中经常有人问到这样的问题 。本文试图通过一些实际的指针使用经验来解释这个问题 。仔细看一下这种声明方式,确实有点让人迷惑 。在某种意义上,"*"和"&"是意思相对的两个东西,把它们放在一起有什么意义呢? 。为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念 。我们都知道MYCLASS*的意思:指向某个对象的指针,此对象的类型为MYCLASS 。void func1(MYCLASS *pMyClass);// 例如:MYCLASS* p = new MYCLASS;func1(p);上面这段代码的这种处理方法想必谁都用过,创建一个MYCLASS对象,然后将它传入func1函数 。现在假设此函数要修改pMyClass:void func1(MYCLASS *pMyClass)DoSomething(pMyClass);pMyClass = // 其它对象的指针}第二条语句在函数过程中只修改了pMyClass的值 。并没有修改调用者的变量p的值 。如果p指向某个位于地址0x008a00的对象,当func1返回时 , 它仍然指向这个特定的对象 。(除非func1有bug将堆弄乱了,完全有这种可能 。)现在假设你想要在func1中修改p的值 。这是你的权利 。调用者传入一个指针,然后函数给这个指针赋值 。以往一般都是传双指针 , 即指针的指针,例如,CMyClass** 。MYCLASS* p = NULL;func1(&p);void func1(MYCLASS** pMyClass);*pMyClass = new MYCLASS;……}调用func1之后 , p指向新的对象 。在COM编程中 , 你到处都会碰到这样的用法--例如在查询对象接口的QueryInterface函数中:interface ISomeInterfaceHRESULT QueryInterface(IID &iid, void** ppvObj);……};LPSOMEINTERFACE p=NULL;pOb->QueryInterface(IID_SOMEINTERFACE, &p);此处,p是SOMEINTERFACE类型的指针,所以&p便是指针的指针 , 在QueryInterface返回的时候,如果调用成功,则变量p包含一个指向新的接口的指针 。如果你理解指针的指针,那么你肯定就理解指针引用,因为它们完全是一回事 。如果你象下面这样声明函数:void func1(MYCLASS *&pMyClass);pMyClass = new MYCLASS;……}其实,它和前面所讲得指针的指针例子是一码事 , 只是语法有所不同 。传递的时候不用传p的地址&p,而是直接传p本身:MYCLASS* p = NULL;func1(p);在调用之后,p指向一个新的对象 。一般来讲 , 引用的原理或多或少就象一个指针 , 从语法上看它就是一个普通变量 。所以只要你碰到*&,就应该想到** 。也就是说这个函数修改或可能修改调用者的指针,而调用者象普通变量一样传递这个指针 , 不使用地址操作符& 。至于说什么场合要使用这种方法,我会说,极少 。MFC在其集合类中用到了它--例如,CObList,它是一个CObjects指针列表 。class CObList : public CObject……// 获取/修改指定位置的元素CObject*& GetAt(POSITION position);CObject* GetAt(POSITION position) const;};这里有两个GetAt函数 , 功能都是获取给定位置的元素 。区别何在呢?区别在于一个让你修改列表中的对象,另一个则不行 。所以如果你写成下面这样:CObject* pObj = mylist.GetAt(pos);则pObj是列表中某个对象的指针,如果接着改变pObj的值:pObj = pSomeOtherObj;这并改变不了在位置pos处的对象地址,而仅仅是改变了变量pObj 。但是,如果你写成下面这样:CObject*& rpObj = mylist.GetAt(pos);现在,rpObj是引用一个列表中的对象的指针,所以当改变rpObj时,也会改变列表中位置pos处的对象地址--换句话说,替代了这个对象 。这就是为什么CObList会有两个GetAt函数的缘故 。一个可以修改指针的值,另一个则不能 。注意我在此说的是指针,不是对象本身 。这两个函数都可以修改对象,但只有*&版本可以替代对象 。在C/C++中引用是很重要的,同时也是高效的处理手段 。所以要想成为C/C++高手 , 对引用的概念没有透彻的理解和熟练的应用是不行的 。5,请教c中引用和指针的用法1.首先:& 的意思是取地址,即某个变量在内存的位置2.scanf函数的第2个参数是指针类型,也就是地址,3.所以需要在arrint[i]前加&,解释完毕如果以后打算使用c语言的话,建议你去看一下C语言教程,函数的参数传递,以及指针等等 。1.首先:& 的意思是取地址,即某个变量在内存的位置2.scanf函数的第2个参数是指针类型,也就是地址 , 3.所以需要在arrint[i]前加&,解释完毕如果以后打算使用c语言的话 , 建议你去看一下C语言教程,函数的参数传递,以及指针等等 。C的语法就这样 , 输出的时候必须带&,但是赋值的时候就不需要arrInt[i]是int类型,而scanf需要的是个变量的指针类型,所以要去arrInt[i]的地址&arrInt[i]你首先要明白,指针运算符的作用,我用一言以概之,你在哪里使用都不会错 。指针运算符*的作用是求出*后面所指地址里的值 。因此只要*后面的变量表示的是一个地址就可以使用*运算符 , 来求出这个地址中的值,你不用管这个地址的表示形式是怎样的,只要是地址就可以使用*来求出地址中的值 。因此i=*&p; 错误,因为p是指针,那么&p表示的是指针p的地址,那么*&p表示的就是指针p的地址中的值,也就是p了,这个值也是个地址 , 变量i要求的是一个整型值,因此错误 。这里要注意,指针p同样有地址 , 而且也有值,指针p的值就是p,但这个值是另一个变量的地址 。q=**&p;错误,*&p的解释同上 , 而**&p就是求指求p所指负的地址的值,也就是*p的意思,而q要求是一个地址,因此错误 。i=&*p; 错误 , *p表示p所指地址处的值,&*p表示对p所指向的值再求地址,因此是错误的,因为i要求是一个整数,而不是一个地址 。p=&*&i;正确,因为*&i就等于i的值,而&i表示的就是i的地址,因此正确 。q=*&*p;错误,简单的判断方法就是最左边的运算符为*运算符 , 这个运算符的结果是一个值而不是地址,因此肯定错误 。具体一点就是*p指的是p所指地址处的值,而&*p也就等同于p了 。i=*&*p ;正确 , 原理同上面的解释你看一下scanf的函数原型就知道了,那是个指针6,C中的引用是怎么个用法先定义引用的变量,再对其进行附值,也可以在定义的同时进行附值 。如:int &x;x=y;或者int &x=y;这样之后就可以用x或y来表示同一个整型变量 。这两个变量用的是同一个空间 。首先你要理解什么是动态联编:动态联编是指在程序运行时进行的联编,也称晚期联编 。动态联编要求在运行时解决程序中的函数调用与执行该函数代码间的关系 。使用虚函数可实现动态联编,不同联编可以选择不同的实现,这便是多态性 。继承是动态联编的基?。楹嵌嗟墓丶?。虚函数是一种非静态的成员函数 , 定义格式如下:virtual() { // } 其中,virtual 是关键字 。如果某个类中的一个成员函数被说明为虚函数,该成员函数可能在派生类中存在着不同的实现版本 。由于存在虚函数,编译器将进行动态联编,使调用虚函数的对象在运行时确定,以实现动态联编的多态性 。例如:使用虚函数将上例改为动态联编的情况,将得到不同的结果 #include class base { protected: int x; public: base(int a) { x=a; } virtual void print() { cout<<“base ”<<<“\n”; } }; class first_d: public base { public: first_d(int a): base(a) { } virtual void print() { cout<<“first derivation\n”<<<“\n”; } }; class second_d: public base { public: second_d(int a):base(a) { } virtual void print() { cout<<“second derivation\n”<<<“\n”; } }; void main() { base *p; base obj1(1); first_d obj2(2); second_d obj3(3); p=&obj1; p->print(); p=&obj2; p->print(); p=&obj3; p->print(); obj2.print(); obj3.print(); } 运行结果: base 1 first derivation 2 second derivation 3 first derivation 2 second derivation 3 程序中,p->print();出现了三次,由于p 指向的对象不同,每次执行了print() 的不同实现版本 。实现了“单界面、多实现版本”的思想 。int x=20;int &y=x;这样cout<<y时候就等于直接引用x了int &x=y那么x就是y的别名,就像人有两个名字一样,都表示的同一个变量int &x=y;x是y的引用,可以理解为x是y的别名,就像你有个名字,还有个昵称,但是不管哪个称呼,指的都是你 。
- Mysql使用索引查询 mysql使用round
- 联合索引怎么创建 联合索引mongodb
- mongodb sort 索引 mongodb多个字段索引
- 安徽理工大学 安徽工业大学 mysql高可用的架构
- 系统工具箱,电脑的DOS工具箱是干嘛用的
- mongodb聚合查询优化 mongodb聚合运算需要索引吗
- mysql网络通讯
- mysql主键需要加索引吗 mysql加主键过程原理
- mysql分几层
- uth
