c++中为什么函数中js的if语句里输出总是会打印输出两遍

C++中else if语句为什么经常会这样?_百度知道MyClassGETNUM(){;private;;};;intmain();{MyClassmy(10);;cout&&MY.GETNUM()&;return0;;9.描述命题“A小于B或小于C”的表达式为A&l;10.对嵌套if语句的规定是:else总是与el;11在C++中有二种参数传递方式:值传递和地址传;12定
MyClass GETNUM(){} //取x值
int main()
MyClass my(10);
cout&&MY.GETNUM()&&ENDL;
9.描述命题 “A 小于 B 或小于 C” 的表达式为A&B || A&C
10.对嵌套 if 语句的规定是: else 总是与 else if
11在 C++ 中有二种参数传递方式: 值传递和地址传递
12定义重载函数时,应在 参数的数量或类型
13类是用户定义的类型,具有类类型的变量称作 类对象
14 当建立一个新对象时,程序自动调用 类的构造函数 。
15一元操作符,作为友元函数重载时只能声明 1
形参;作为类成员函数重载时 0
四、判断题
(1)函数体内声明的静态变量,至多只会被初始化一次。 r
(2)对于同一个类中的两个非静态成员函数,它们的函数的名称、参数类型、参数个数、参数顺序以及返回值的类型不能完全相同。 r
(3)inline函数表示编译器一定会将函数体直接插入到调用此函数的地方,这样可以加快程序的运行速度。 w
(4)将类A所有构造函数的可访问性都限制为私有的,那么在main函数中不可能得到类A的实例对象。 r
(5)名字空间是可以多层嵌套的;对于类A中的函数成员和数据成员,它们都属于类名A代表的一层名字空间。 r
(6)若在类Base和派生类Derived中,分别声明一个同名的整型成员变量 ,那么通过Derived类的实例对象,不可能输出基类Base中的变量x的值。 W
(7)若类A是类B的友员类,且类B是类C的友员类,那么类A也是类C的友员类。 w
(8)虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。 w
(9)构造函数的初始化列表中的内容,不会影响构造对象中成员数据的初始化顺序。 r
五、简答题
1.为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern &C& {
#ifdef __cplusplus
#endif /* __INCvxWorksh */
头文件中的编译宏
#ifndef __INCvxWorksh
#define __INCvxWorksh
的作用是防止被重复引用。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y);
该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。
为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern &C&来解决名字匹配问题,函数声明前加上extern &C&后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。
2. 什么时候需要“引用”?
流操作符&&和&&、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
3. “引用”与多态的关系?
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。
4.函数模板与类模板有什么区别?
答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。
5. 请讲一讲析构函数和虚函数的用法和作用?
答:析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。只是在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。另: 析构函数一般在对象撤消前做收尾工作,比如回收内存等工作,
虚拟函数的功能是使子类可以用同名的函数对父类函数进行覆盖,并且在调用时自动调用子类覆盖函数,如果是纯虚函数,则纯粹是为了在子类覆盖时有个统一的命名而已。
注意:子类重新定义父类的虚函数的做法叫覆盖,override,而不是overload(重载),重载的概念不属于面向对象编程,重载指的是存在多个同名函数,这些函数的参数表不同..重载是在编译期间就决定了的,是静态的,因此,重载与多态无关.与面向对象编程无关.
含有纯虚函数的类称为抽象类,不能实例化对象,主要用作接口类//
7.函数重载是什么意思?它与虚函数的概念有什么区别?
答:函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数、参数类型不同,函数的返回值来区分该调用哪一个函数,即实现的是静态的多态性。但是记住:不能仅仅通过函数返回值不同来实现函数重载。而虚函数实现的是在基类中通过使用关键字virtual来申明一个函数为虚函数,含义就是该函数的功能可能在将来的派生类中定义或者在基类的基础之上进行扩展,系统只能在运行阶段才能动态决定该调用哪一个函数,所以实现的是动态的多态性。它体现的是一个纵向的概念,也即在基类和派生类间实现。
有如下类定义:
virtual ~B();
假设在32位的操作系统和编译器下,int型变量为4个字节,按4字节方式对齐,请问sizeof(B)的大小为多少?并说明这个大小是怎么计算出来的?
答:12 。理由:m_iPoint占用4,采用4字节对齐,m_sLength也占用4个字节;static
int m_iTotal不占用空间,它是对象间共享的数据,占用自己单独的空间;另外4个字节占用是因为析构函数为虚函数,所以有一个虚函数指针!
9.请针对以下关键字static,const,virtual,friend的使用场合,举例说明他们在函数的声明,定义中的用法,并说明使用这些关键词的作用。
1static修饰一个函数为静态成员函数,在声明的时候有,定义的时候没有。用来生命一个函数是静态成员函数,用来访问静态成员变量:
static int fun();
int CMyclass:: fun(){}
2const修饰一个函数为静态成员函数,在声明的时候有,定义的时候也有。说明一个函数是常成员函数,便是他不能修改该类的成员变量
int CMyclass:: fun()const {}
3 virtual在基类中用来修饰一个函数为虚函数,在声明的时候有,定义的时候没有。说明一个函数是虚函数,可以在派生类中来对他的功能进行定义或者扩展;
virtual int fun();
int CMyclass:: fun(){}
4 friend修饰一个函数为友元函数,在声明的时候有,定义的时候没有。说明一个函数是该类的友元函数,可以在该函数中访问类的非公有成员;
friendint fun();
int CMyclass:: fun(){//访问非公有成员}
10.谈谈你对运算符new,delete,malloc,free的理解。
答:运算符new用来向系统动态开辟堆内存空间,delete用来释放new开辟堆内存空间。记
住两者配套使用,防止内存泄漏;释放指针指向的内存空间,而不是删掉指针!释放后指针的地址值不变,所以为了防止产生野指针,释放后最好将指针赋值为空。记住若果开辟的是动态数组,应该加上[],表示释放的是数组空间。malloc是c语言库函数,也是用来开辟空间,开辟的空间使用完以后使用free函数释放,同理释放完后也需要将指针赋值为空。跟new运算符不同的是malloc在开辟的空间的时候不能初始化,开辟空间的字节数需要指明,new运算符可以初始化,开辟空间的字节数由系统计算出来。
11.派生类B有与父类A相同名称的共有成员Member,请问在B中如何访问A中的公有成员Member?
答:域限定符指明它属于哪个类;
12.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c用宏定义,c++用inline
13.Template有什么特点?什么时候用?
答: Template可以独立于任何特定的类型编写代码,是泛型编程的基础.
当我们编写的类和函数能够多态的用于跨越编译时不相关的类型时,用Template.
模板主要用于STL中的容器,算法,迭代器等以及模板元编程.
14. main 函数执行以前,还会执行什么代码?
答案:全局对象的构造函数会在main 函数之前执行。
15. 描述内存分配方式以及它们的区别?
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
16.当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。
答案:肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]?了。
17.在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern &C&修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
包含各类专业文献、应用写作文书、高等教育、各类资格考试、文学作品欣赏、中学教育、专业论文、外语学习资料、72C++测试题等内容。 
 C++期末考试试卷(含答案)_IT/计算机_专业资料。高级汇编语言南昌大学 2007 ~ ...程序设计题(每小题 9 分,共 18 分) 得分 评阅人 1.设学生的人数已知,...  C++测试题_IT认证_资格考试/认证_教育专区。C++ C++测试题一、 填空题(30 空 * 1 分) 1. 在 C++中,函数的参数有两种传递方式,它们是值传递和___。 2. ...  C++试题库有答案的_计算机软件及应用_IT/计算机_专业资料。C++试题库 一、 选择题 1、求“abc\\12\n”字符串的长度( C ) (A) 5 (A) 6 (A) 6 (B)...  c++考试试题(c++第四版)_IT认证_资格考试/认证_教育专区。一、选择题 1.一个最简单的C++程序,可以只有一个( 1.一个最简单的C++程序,可以只有一个( c )。...  CC++笔试试题大全(附有答案)_IT认证_资格考试/认证_教育专区。CC++笔试试题大全(附有详细答案)1.求下面函数的返回值(微软) int func(x) { int countx = 0...  C++试题(附答案)_计算机软件及应用_IT/计算机_专业资料。一、选择题 1.在下列有关析构函数的描述中,错误的是(B) 在下列有关析构函数的描述中,错误的是( )...  月考成绩列表序 号 1 2 3 考试场次 试卷名称 分数 考试时间 进入试 2014_06 月月考_06 月 26 日_C++/IOS 2014_07 月月考_07 月 31 日_C++/.NET/...  模拟试题一一、单项选择题(本大题共 10 小题,每小题 2 分,共 20 分) 1...在 C++中 Fun,使用 类型的参数, 2.在 C++中,编写一个内联函数 Fun,使用 ...  C++面向对象程序设计考试试题答案 一、单项选择题(在每小题的四个备选答案中,选出一个正确的答案, 并将其号码填在题干后的括号内。每小题 1 分,共 20 分...C++中if语句后面的逻辑表达式的问题_百度知道c++中我想用if语句输出多个(用循环)_百度知道C++中打印函数调用情况
C++中打印函数调用情况
发布时间: 10:10:41
编辑:www.fx114.net
本篇文章主要介绍了"C++中打印函数调用情况",主要涉及到C++中打印函数调用情况方面的内容,对于C++中打印函数调用情况感兴趣的同学可以参考一下。
在Java&中,如果产生异常,程序员可以很方便地调用printStackTrace()显示堆栈情况,这是因为Java虚拟机掌握所有运行时系统的信息。但是在C++中就没有相应的功能了,为了方便在调试时观察堆栈调用情况,我写了个很简单的框架来实现基本功能。
#include&&string&#include&&list&#include&&exception&#include&&iostream&using&std::using&std::/**//**&*&Calling&stack&recording&class,&used&to&store&function&names&in&current&*&calling&stack.&*&*&@see&Tracelet&*/class&StackRecord...{public:&&&&static&void&PrintStack();&&&&static&void&Push(const&std::string&&aFuncName);&&&&static&void&Pop();private:&&&&static&std::list&std::string&&mN};std::list&std::string&&StackRecord::mNvoid&StackRecord::Push(const&std::string&&aFuncName)...{&&&&mNames.push_back(aFuncName);}void&StackRecord::Pop()...{&&&&mNames.pop_back();}void&StackRecord::PrintStack()...{&&&&std::list&std::string&::const_iterator&p;&&&&for(p&=&mNames.begin();&p!=mNames.end();&++p)&&&&&&&&cout&&&&*p&&&&}/**//**&*&Facility&class&to&help&add&function&name&to&trace&record.&*/class&Tracelet...{public:&&&&Tracelet(const&std::string&&aFuncName);&&&&~Tracelet();};Tracelet::Tracelet(const&std::string&&aFuncName)...{&&&&StackRecord::Push(aFuncName);}Tracelet::~Tracelet()...{&&&&if&(std::uncaught_exception())&&&&&&&&//&during&exception&handling&&&&&&&&StackRecord::PrintStack();&&&&//&during&normal&return&&&&StackRecord::Pop();}#define&TRACE(s)&Tracelet&tracelet(s)
StackRecord类负责纪录当前函数调用栈的情况,Tracelet类负责push或者pop函数名称。下面是一个例子:
#include&"trace.h"void&foo()...{&&&&TRACE("foo");&&&&throw&'a';}int&main()...{&&&&TRACE("main");&&&&try&...{&&&&&&&&foo();&&&&}&catch(char&a)&...{&&&&&&&&cout&&&&"exception&occured"&&&&&&&&}&&&&return&0;}
输出结果为:
原理是,当exception发生,并且被try_catch处理时,所有在try_catch块内的堆栈变量都会自动调用destructor。在每个函数声明一个Tracelet的局部变量对象,这样,当exception发生时,该对象被自动解构,destructor中的uncaught_exception()函数会判断destructor是不是被exception handler调用的,是的话打印stack trace。
如果程序没有exception handler, 也就是try_catch块,而产生了exception时,系统默认调用terminate函数,这时如果也想看到stack trace,则要用set_terminate()定义自己的terminate handler函数。代码如下:
#include&"trace.h"void&termFunc()...{&&&&StackRecord::PrintStack();}void&foo()...{&&&&TRACE("foo");&&&&throw&'a';}int&main()...{&&&&std::set_terminate(termFunc);&&&&TRACE("main");&&&&foo();&&&&return&0;}
本文标题:
本页链接:}

我要回帖

更多关于 java输出语句 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信