写在前面
唯一算是有点遗憾的事情吧,当初研一就应该过一遍的,但是一直拖着,每个月学一点,结果到现在就一直原地踏步,这些东西是躲不过的,做好自己吧。
从C走进C++
1. 函数指针
-
每个函数占用一段连续的内存,函数名就是该函数的起始地址(入口地址),将该入口地址赋给一个 指针变量————————函数指针!
-
可以通过该指针变量调用这个函数。
2. 命令行参数
这个太简单,就不说了,就是
3. 位运算
- 常见的:
4. 引用
- 引用是对变量的引用!
- 某个变量的引用,等价于这个变量,相当于该变量的一个别名,绰号一样!。
- 而且可以通过引用来改变变量!
- 引用还可以作为函数的返回值(至于为什么要这样还是要从后面的学习中知道的):
可以将函数的调用放在赋值号的左边
- 常引用:定义引用时,前面加const关键字
5. const关键字和常量
多用const少用define,因为const是有类型的
(1)第一个用法:定义常量(有类型的,便于编译的时候的检查)
(2)第二个用法:定义常量指针,不可通过常量指针修改其指向的内容。指向常量的指针,内容不能通过常量指针来修改!
还有一个:
6. 动态内存分配(按需分配!)
C语言中:malloc/free
运算符
C++语言中:new/delete
运算符
具体的二者的区别之前有进行过比较信息的对比和比较,地址malloc/free和new/delete的区别以及联系
C++中的用new
(1)第一种用法:分配一个变量:
(2)第二种用法:分配一个数组(好大一片内存空间)
(3)new运算符的返回值类型:
(4)delete来释放动态分配的内存
- 回收分配出来的变量的内存。
- 回收分配出来的数组的内存
7. 内联函数和重载函数
(1) 内联函数:
调用函数的开销比函数本身执行起来的时间消耗要大得多~
如何写???
把inline
卸载函数之前
所以这样做的时候一般都是小函数,不然就得不偿失了!
因为函数体量就变得非常大!关于具体的
(2)函数重载(名字相同,参数表不同!!!!!)
!!!让函数的命名变得简单很多!只是参数表不一样!
8.函数缺省参数
- 可以提高程序的可扩充性等等
9.面向对象程序设计方法
结构化程序设计的四大囧境(大问题->子问题)
- 结构化程序设计的直观理解
- 面向对象的程序设计方法:
清晰化,条理化
举个例子就是小黄人!
好啦,下面正经严肃一点就是:
10.面向对象语言的发展历程
讲故事咯~
11.从客观事物抽象出类的例子
-
变量:成员变量
-
函数:成员函数
上面两个统称为类的成员! -
对象的内存分配:
-
访问类的成员变量和成员函数 的三种方式!
(1) 对象名.成员名
CRectangle r1, r2;
r1.w = 5;
r2.init(3, 4)
(2)指针->成员名
CRectangle r1, r2;
CRectangle * p1 = & r1;
CRectangle * p2 = & r2;
p1->w = 5;
p2->Init(3,4); //Init作用在p2指向的对象上
(3)引用名.成员名
CRectangle r2;
CRectangle & rr = r2;
rr.w = 5;
rr.Init(3,4); //rr的值变了,r2的值也变
10
- 类的成员函数的另外一种写法,就是函数体和类的定义分开写,成员函数只在类里面进行申明就好了,比如下面的例子!
class CRectangle
{
public:
int w, h;
int Area(); //成员函数仅在此处声明
int Perimeter() ;
void Init( int w_, int h_ );
};
int CRectangle::Area() {//注意这里的双冒号,这样的标记就是用来告诉我们是类的成员函数的!
return w * h;
}
int CRectangle::Perimeter() {
return 2 * ( w + h );
}
void CRectangle::Init( int w_, int h_ ) {
w = w_; h = h_;
}
然后这些调用的方法还是一样,还是上面介绍到的三种方法!
12.类成员的可访问范围
主要讲的就是private, public, 以及protected
这三个啦~~
值得了解的是这三个关键字出现的次数以及先后顺序是没有什么限制的!!!很自由哦~
如果没有写出来是哪一种,那就是缺省为私有成员!!!
- 还是访问权限的问题:
(1)类的成员函数内部, 可以访问:
•当前对象的全部属性, 函数
•同类其它对象的全部属性, 函数
(2)类的成员函数以外的地方,
•只能够访问该类对象的公有成员
还是看一个例子来理解!
class CEmployee {
private:
char szName[30]; //名字
public :
int salary; //工资
void setName(char * name);
void getName(char * name);
void averageSalary(CEmployee e1,CEmployee e2);
};
void CEmployee::setName( char * name) {
strcpy( szName, name); //ok
}
void CEmployee::getName( char * name) {
strcpy( name, szName); //ok
}
void CEmployee::averageSalary(CEmployee e1,CEmployee e2){
salary = (e1.salary + e2.salary )/2;
}
int main(){
CEmployee e;
strcpy(e.szName,"Tom1234567889"); //**编译错, 不能访问私有成员**
e.setName( "Tom"); // ok
e.salary = 5000; //ok
return 0;
}
•设置私有成员的目的
•强制对成员变量的访问一定要通过成员函数进行
•设置私有成员的机制 – 隐藏,极大程度的可以避免程序出错!
比如下面的例子:
szName 的大小变为 char szName[5]
(1)如果szName不是私有, 需要修改全部:
strcpy(man1.szName, “Tom1234567889”);
(2)如果将szName变为私有,所有对 szName的访问都是通过成员函数来进行,
man1.setName( “Tom12345678909887”);