C++的基础知识
2007-08-21 16:45
483 查看
一.请填写BOOL ,float, 指针变量与 “零值”比较的if 语句。
提示:这里“零值”可以是 0 ,0 .0 ,FALSE或者“空指针”。例如 int 变量 n 与 “零值”比较的if 语句为: if (n ==0)
if (n!=0)
以次类推:
请写出BOOL flag与”零值” 比较的 if 语句:if(flag)
请写出 float x 与”零值” 比较的 if 语句:
const float ESPON=0.000001;
if( ( x =< ESPON)&& ( x >= - ESPON) );
请写出char *p 与”零值” 比较的 if 语句:if( p==NULL )
二.以下为WINDOWS NT 下的32位 C++程序 ,请计算 sizeof 的值。
char str[] = “Hello”;
char *p = str;
int n = 10;
请计算
sizeof (str) = 6
sizeof (p) = 4
sizeof (n) = 4
void Fun (char str[100])
{ //请计算
sizeof (str) = 4
}
void *p = mallo(100);
//请计算
sizeof(p) = 4
三.简答题
1. 头文件中的ifndef/define/endif 干什么用?
答: 防止该头文件被重复引用.
2. #include <filename.h> and #include “filename.h”有什么区别?
答: 对于#include <filename.h>,编译器从标准库开始查找filename.h
对于#include “filename.h” ,编译器是从用户的工作路径开始查找filename.h
3. const 有什么用途 ?(请至少说明两种)
答: 1.可以定义const常量.
2.const可以修饰函数的参数,返回值,甚至函数的定义体.被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.
4. 在C++ 程序中调用被C 编译器编译后的函数 ,为什么要加 extern “C” ?
答: C++语言支持函数重载,C不支持函数重载.函数被C++编译后在库在的名字与C语言不同.例如:void foo(int a,int b);该函数被C编译器编译后在库中为_foo,而C++编译器则会产生像_foo_int_int之类的名字.
C++提供了C连接交换指定符号 extern “C”来解决名字匹配问题.
5. 请简述以下两个 for 循环的优缺点
//第一个 for ( I = 0 ; I< N ; I ++) { if (condition) DoSomething(); else DoOtherthing(); } 优点:程序简洁 缺点:多执行了N-1次逻辑判断, 并且打断了循环”流水线”作业,使得编译器不能对循环进行优化处理,降低 了效率. | 第二个 if (condition) { for (I = 0 ; I < N ; I++ ) DoSomething(); } else { for (I =0 ; I < N ; I ++) DoOtherthing();} 优点:循环的效率高 缺点:程序不简洁 |
四.有关内存的思考题
void GetMemory (char * p) { p = (char * ) malloc (100); } void Test (void) { char * str = NULL ; GetMemory (str ); strcpy (str, “hello word” ); printf (str ); } 请问运行Text 函数会有什么样的结果? 答:程序崩溃 因为GetMemory并不能传递动态内存, Test函数中的str一直是NULL, strcpy(str,”hello world”)将使程序崩溃 | void * GetMemory ( ) { char p[] = “hello word”; return p; } void Test (void) { char * str = NULL ; str = GetMemory ( ); printf (str ); } 请问运行Text 函数会有什么样的结果? 答: 可能是乱码. 因为GetMemory返回的是指向”栈内存”的 指针,该指针的地址不是NULL,但其有原先 的内容已被清除,新内容不可知. |
void GetMemory(char * p , int num) { * p = (char * ) malloc ( num); } void Test (void) { char * str = NULL ; GetMemory ( &str ,100 ); strcpy (str, “hello word” ); printf (str ); } 请问运行Text 函数会有什么样的结果? 答:1.能够输出hello. 2.内存泄漏. | void Test (void) { char * str = ( char *) malloc (100) ; strcpy (str , “hello” ); free (str ); if (str != NULL) { strcpy (str ,”word”); printf (str ); } } 请问运行Text 函数会有什么样的结果? 答: 篡改动态内存区的内容,后果难以预料, 非常危险. 因为free(str)之后,str成为野指针, if(str != NULL)语句不起作用. |
| |
五. 编写strcpy 函数
已知 strcpy 函数的原形是:char strcpy (char * strDest ,const char * strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。
(1) 不调用C++ /C的字符串库函数,请编写函数 strcpy
Char* strcpy(char* strDest,const char* strSrc)
{
Char* address = strDest;
assert( ( strDest != NULL) && ( strSrc != NULL ) );
while( ( *strDest ++ = *strSrc++ ) != ‘/0’ );
return address;
}
(2) strcpy 能把strSrc 的内容复制到 strDest,为什么还要用 char * 类型的返回值 ?
答:为了实现链式表达式.
例如:int length = strlen( strcpy( strDest,”hello world” ) );
六.编写类String 的构造函数` 析构函数 和赋值函数
已知类String 的原形为:
class String
{
public:
String (const char *str = NULL); //普通构造函数
String (const String &other ); //拷贝构造函数
~String(void); //析构函数
String operator= (const String &other); //赋值函数
private :
char *m_data ; //用于保存字符串
};
请编写上述4个函数:
//String的普通构造函数
String::String(const char *str)
{
If(str == NULL)
{
m_data = new char[1];
*m_data = ‘/0’;
}
else
{
int length = strlen(str);
m_data = new char[length +1];
strcpy(m_data,str);
}
}
//String 析构函数
String::~String(void)
{
Delete [] m_data;
}
// Stringr 拷贝构造函数
String:: String(const String &other)
{
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data,other.m_data);
}
// String赋值函数
String operator = (const String &other)
{
If( this == &other )
{
Return *this;
}
Delete [] m_data;
Int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data,other.m_data);
return *this;
}
相关文章推荐
- C++入门基础知识
- C++基础知识 day2
- c++之基础知识(2)重载 操作符重载
- C++基础知识: 公有继承,保护继承,私有继承的总结,私有继承的用意何在
- 面试篇之~ c++ 基础知识简单总结 (一)
- C++基础知识(一)—— C++程序结构
- C++基础知识(四)—— 操作符/运算符
- 关于C++程序设计的基础核心之二:继承与派生的基本知识
- C++基础知识总结与回顾--5.5共享数据的保护
- C++基础知识
- C++基础知识3
- C++零碎基础知识点(一)
- C++之基础知识学习笔记
- C++基础知识点总结之常量与引用
- 有关C/C++的一些基础知识
- C++笔记(3):一些C++的基础知识点
- C++基础知识(四)类进阶:抽象类和接口
- 找的c++基础知识
- C++ 基础知识回顾总结
- C++基础知识点遗忘二字符与树的遍历节点判断