没有合适的资源?快使用搜索试试~ 我知道了~
C++底层核心本质总结笔记
1星 需积分: 9 25 下载量 189 浏览量
2011-04-15
22:36:00
上传
评论 3
收藏 1.44MB DOC 举报
温馨提示
试读
64页
底层核心本质总结,拨开迷雾,看清C++本质。深层高质量剖析C++笔记:全方位了解C++的底层即实现机制,各种重点和核心技术。是本人多年的心得体会。终于让他发行了。希望大家支持。
资源推荐
资源详情
资源评论
联合(union)
同 struct 一样,联合默认访问权限也是公有的。并且,我们可以为联合定义成员函
数,包括构造函数和析构函数。但联合不能包含虚函数或静态成员变量/方法。
union test
{
test(){}
int oce;
char teacher[5];
}
特殊的关键字
const 关键字
一般在 const 对象中所有成员值都是不可修改的,除非一个成员被声明为 mutable。 所以一
个类的 const 对象只能调用被声明为 const 的成员函数(构造和析构函数除 外)。mutable 用于
用户只想修改某个成员值而保持其他值不变。在 C++中,相比#define,const 有更多的优点:
1 编译器可以对 const 常量进行类型安全检查,而#define 只进行字符替换,没有类型
安全检查。
2 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
const 成员函数可以被相同参数表的非 const 成员函数重载。
C 默认 const 是外部连接的,C++默认 const 是内部连接的。因此,如果
在 C++中想完成与 C 中同样的事情,必须用 extern 把内部连接改成外部连接:
extern const bufsize ; // 只是声明
如果 const 变量是用常量表达式初始化,那么它就应该在头文件中定义。相反,和其
他的变量一样,该 const 变量应该在一个源文件中定义并初始化。应在头文件中为它添
加 extern 声明,以使其能被多个文件共享。
volatile 关键字
当一个对象的值可能会在编译器的控制或监测之外被改变时(例如一个被系统时钟更新的变量),那么该对象
应该声明成 volatile。因此编译器执行的某些例行优化行为不能应用在已指定为 volatile 的对象上。也可以将成
员函数声明为 volatile。对于一个 volatile 类对象,只有 volatile 成员函数、构造函数和析构函数可以被调用。
#include <iostream.h>
class T
{
public:
T()
{
cout<<"T()"<<endl;
}
void get()volatile
{
cout<<"get()"<<endl;
}
protected:
private:
};
void main()
{
volatile T t;
t.get();
}
mutable 关键字
为了允许修改一个类的数据成员,即使它是一个 const 对象的数据成员,我们可以把该数据成员声明为
mutable。mutable 成员总可以被更新,即使是在一个 const 成员函数中。
#include <iostream.h>
class T
{
public:
T()
{
cout<<"T()"<<endl;
}
void get()const
{
a++;
cout<<"get()"<<endl;
}
protected:
private:
mutable int a;
};
void main()
{
T t;
t.get();
}
explicit 关键字
C++中,带单一参数的类构造函数在缺省情况下隐含一个转换操作符| 将该构造函数对
应的函数参数转换为该类对象。
例
class MyClass f
public:
MyClass( int num ) ; // constructor and implicit conversion operator
};
...
MyClass obj = 10 ; //ok,convert int to MyClass
在上面的代码中编译器自动将整型转换为 MyClass 类对象,实际上等同于下面的操
作:
MyClass temp(10);
MyClass obj = temp ;
在很多情况下,这个转换是有益的,并且是正当的。但有时我们不希望进行这种自动
的转换。在声明构造函数的时候前面添加上 explicit 就可以防止这种自动的转换操作。如
果我们修改上面的 MyClass 类的构造函数为显示的,那么下面的代码就不能够编译通过
了。
class MyClass f
public:
explicit MyClass( int num ) ;
};
...
MyClass obj1 = 10 ; // error,can't non-explict convert
MyClass obj2 ;
obj2 = 20 ; // error,can't non-explict convert
new & delete 运算符
int *m=new int[20]; //分配长度为 20 的 int 型数组
int *j=new(11); //把新分配的变量初始化为 11
new 也可以用来分配指定的地址,
new (ptr) type
返回一个指向 ptr 所指地址的指针,此时必须包括头文件<new>。
对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构
造函数,对象在消亡之前要自动执行析构函数。由于 malloc/free 是库函数而不是运算符,不在编译器控制权限
之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。因此 C++语言需要一个能完成动态内存分
配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。new/delete 不是库函数,
而是运算符。
位域(bit-eld):一种节省空间的成员
有一种被称为位域(bit-¯eld)的特殊的类数据成员,它可以被声明用来存放特定数目的位。它可以有符号,
也可以无符号。
类的作用域
在类的定义中可知,类域中可以定义变量,也可以定义函数。从这一点上看类域与文件域
很相似。但是,类域又不同于文件域,在类域中定义的变量不能使用 auto,register 和 extern
等修饰符,只能用 static 修饰符,而定义的函数也不能用 extern 修饰符。另外,在类域中
的静态成员和成员函数还具有外部的连接属性.
例如:
#include <iostream..h>
Class T
{
Public:
T(){}
~T(){}
Private:
Int data;//正确
Auto int a;//错
};
void main()
{
}
拷贝构造函数为什么是 Object(const Object& O1);
拷贝构造函数的参数必须是类对象的常引用。
Person(const Person & s )
不能将一个常对象赋给一个非常对象。
假如非引用传参,那么 O1 是不是要调用它的拷贝构造函数,传参后因为非引用传参,有调用拷贝构造函数,
如此递归,将陷入死循环。假如是引用传参,则不会调用自己的拷贝构造函数。
明智地使用私有继承
class Person { ... };
class Student: // 这一次我们
private Person { ... }; // 使用私有继承
void dance(const Person& p); // 每个人会跳舞
void study(const Student& s); // 只有学生才学习
Person p;/ p 是一个人
Student s;// s 是一个学生
dance(p);// 正确, p 是一个人
dance(s);// 错误!一个学生不是一个人
很显然,私有继承的含义不是 "是一个",那它的含义是什么呢?
私有继承有那些行为特征呢?" 那好吧。关于私有继承的第一个规则正如你现在所看到的:和公
有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象(如
Student)转换成基类对象(如 Person)。这就是上面的代码中为对象 s 调用 dance 会失败的
原因。第二个规则是,从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类
中是保护或公有成员。行为特征就这些。
这为我们引出了私有继承的含义:私有继承意味着 "用...来实现"。如果使类 D 私有继承于类
B,这样做是因为你想利用类 B 中已经存在的某些代码,而不是因为类型 B 的对象和类型 D 的
对象之间有什么概念上的关系。因而,私有继承纯粹是一种实现技术。私有继承意味着只是继承
实现,接口会被忽略。如果 D 私有继承于 B,就是说 D 对象在实现中用到了 B 对象,仅此而已。
私有继承在软件 "设计" 过程中毫无意义,只是在软件 "实现" 时才有用。
下面的例子使用了条款 41 中的非模板 Stack 类,不同的是这里存储的是通用指针,而不是对
象:
class GenericStack {
public:
剩余63页未读,继续阅读
资源评论
- 追者-忆者2021-05-29就是简单的C++笔记,不是低层核心本质总结。
前网易架构师-高司机
- 粉丝: 8168
- 资源: 205
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功