C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html
C++重要知识点小结---2:http://www.cnblogs.com/heyonggang/p/3253036.html
1.什么是智能指针?
智能指针是一个行为类似指针但也提供其他功能的类。
智能指针类实现普通指针行为的类的区别在于:智能指针通常接收指向动态分配对象的指针并负责删除该对象。用户分配对象,但由智能指针类删除它,因此智能指针类需要实现复制控制成员来管理指向共享对象的指针。只有在撤销了指向共享对象的最后一个智能指针后,才能删除该共享对象。使用计数是实现智能指针类最常用的方式。
2.new和delete表达式
- int i(1024);
- int *pi = new int (1024);
- int s(10,'s');
- int *ps = new string(10,'s');
- const int *pci = new const int(1023) ;
- delete指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区,删除动态分配内存失败称为“内存泄漏”
- 读写已删除的对象,如果删除指针所指向的对象后,将指针置为0值,比如容易检测
- 对同一内存空间使用两次delete表达式。当两个指针指向同一个动态创建的对象,删除就会发生错误。
3.类成员函数的重载、覆盖和隐藏区别?
答案:
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
4.以下代码中的两个sizeof用法有问题吗?[C易]
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 |
答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个 静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此siz eof作用于上只将其当指针看,一个指针为4个字节,因此返回4.
5。C++中的空类,默认产生哪些类成员函数?[C++易]
答:
class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& ); // 赋值运算符 Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const };
6、写一个函数,完成内存之间的拷贝。[考虑问题是否全面]
答:
void* mymemcpy( void *dest, const void *src, size_t count ) { char* pdest = static_cast<char*>( dest ); const char* psrc = static_cast<const char*>( src ); if( pdest>psrc && pdest<psrc+cout ) 能考虑到这种情况就行了 { for( size_t i=count-1; i!=-1; --i ) pdest[i] = psrc[i]; } else { for( size_t i=0; i<count; ++i ) pdest[i] = psrc[i]; } return dest; }
7. const有什么用途?
在 c程序中,const的用法主要有定义常量、修饰函数参数、修饰函数返回值等3个用处。
在c++程序中,它还可以修饰函数的定义体,定义类中某个成员为常态函数,即不改变类中的数据成员。
被const修改的东西都要受到强制保护,可以预防意外的变动,能提高程序的健壮性。
8. const与#define相比有什么不同?
它们都可以用来定义常量,但const比#define有更多优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。
(2) 在c++中使用const常量而不使用宏常量,即const常量完全取代宏常量。
参考:http://www.cnblogs.com/heyonggang/archive/2012/12/13/2817065.html
9.编写类string的构造函数、析构函数和赋值函数,已知类String 的原型为:
1 class String 2 { 3 public: 4 String(const char *str = NULL); // 普通构造函数 5 String(const String &other); // 拷贝构造函数 6 ~ String(void); // 析构函数 7 String & operate =(const String &other); // 赋值函数 8 private: 9 char *m_data; // 用于保存字符串 10 };
请编写String 的上述4 个函数。
答案:
1 //普通构造函数 2 String::String(const char *str) 3 { 4 if(str==NULL) 5 { 6 m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志' '的空 7 //加分点:对m_data加NULL 判断 8 *m_data = '