C和 C++的特点

C语言进化到C++ 的过程,是一个障眼法的发展过程。
1、 bool型变量:1个字节变量(和char一样大小),缺省赋值为true(1),false(0)
2、 引用型变量:让新申请的变量挂在原有同类型的内存地址上。引用的优点是书写更加流畅,是代码的逻辑更加清楚。
3、 命名空间:
a) 当工程代码量庞大时,由大量程序员编写的代码出现了重名函数,重名全局变量
b) 使用using namespace std ,语句在每处调用空间内函数不用加域名控制
c) 定义域(::)以后会在类成员函数中常用,
4、 C++输入输出
推荐使用 #include<iostream> uising namespace std;
不推荐使用#include <iostream.h>
cout 和cin比printf和scanf功能更加强大,自动识别类型。
不需要%d和%s等等。
5、 申请堆空间:
New和delete代替malloc和free,使书写更加流畅,尤其申请堆内数组更加直观。
例如://Stest *p=(Stest *)malloc(sizeof(Stest));
Stest *p=new Stest;
//Free(p)
delete p;

//int *p1=(int *)malloc(sizeof(int )*5);
Int *p1=new int [5];
delete []p1 不推荐使用 delete p1
注意:new的错误写法:int p1=new int(5)
6、 函数的默认参数
函数调用时,可以不指定的参数提供默认值。默认值可以在原型或者函数定义中给出,但不能在两个位置同时给出推荐在原型申明中指定默认值。
int add(int data1, int data2,int data3=9)
{
return data1 + data2 + data3;
}

int main()
{
int sum = add(1,2);
}
7、 内联函数:
代替:C语言的宏定义函数,实际也是C++的障眼法之一。编译时仍然按宏定义函数一样处理。
8、 C++由结构体struct升级为class
类内不但支持变量,还支持成员函数,是一个更加严重的障眼法,任何一个类的成员函数内部都隐藏形式参数一个变量叫this指针。
9、 struct和class的区别
struct 和class的唯一区别就是缺省权限不同,public.protected private
1)private:私有权限的成员变量和成员函数,只限于在本类内的成员函数调用;
2)public:共有权限的成员变量和成员函数,在类内和类外多能够被调用;
3)如果class内部的所有成员都是公开,就等于struct 了.
4)公司里开发时,struct往往用于纯数据的结构体,把class 当做多功能类的开发。
10、 C++支持重载函数,C语言不可以有名字相同的函数,
重载函数:函数名字相同,但是参数列表不同(类型和个数不完全相同)
递归函数:C语言和C++都支持
11、 构造函数:
一:
1) 构造函数是类的一种特殊成员函数,一般情况下,构造函数是专门用来初始化成员变量的,所以做好不要在构造函数中进行与对象的初始化无关的操作。
2) 构造函数的函数名一定与类名完全相同,而且没有返回值,(不是说返回值都是void或者int,而是不允许指定返回值)。
3) 构造函数的返回值如果制定了任何类型都是错误的,构造函数的功能是代替C语言对结构体对象初始化的的括号。
4) C语言对结构体成员初始化方式是使用大括号,如果该类(结构体)有构造函数禁止使用大括号初始化成员数据。
二:
构造函数的调用
1) 是在定义对象指定参数或者不指定参 数,都会自动调用构造函数,手工使用对象调用构造函数会出错。
2) 构造函数分为无参、有参和拷贝构造,定义了那种形式的构造函数,就以为只有那种对象定义方式。
3) 使用“=”来调用构造函数,调用单参数的构造函数而且单参数类型和“=”右边的类型相同。
4) 一般情况下“=”右边的类型没有适合单参数构造函数不能使用“=”构造。
5) 只有一种类型合适“=”右边构造函数,系统内部有缺省的拷贝构造函数,内部实现的是要体赋值。
12、 析构函数:
1) 析构函数可以手工调用,但是不推荐手工调用,只要是对象的生命周期结束时,会自动调用析构函数,
2) 析构函数名是在类名前加 ~ ,析构函数同样不能返回任何值,也必须没有函数参数,并且不能被重载,
3) 所以一个类可以有多个构造函数,却只能有一个析构函数,
4) 一般来说,每当创建一个对象时就会调用对象的构造函数,每当撤销一个对象就会调用该对象的析构函数。
13、 构造函数和析构函数的总结:
1) 无论是构造函数还是析构函数,我们都应该把他们视作是一种回调函数。
2) 构造函数和析构函数自身并不对类的成员数据做任何初始化或堆空间的清理工作。
3) 析构函数本身什么都不做,只是到了对象的空间将要销毁的时间点,提示程序员是否要编写一些代码来清理曾经申请过的堆空间。
4) 在析构函数中,程序员只需要考虑对申请过的堆空间进行释放,而本身对象占用的无论是栈空间还是全局空间系统都会自动清理的。
14、 类成员变量的生命周期:
1) 类成员函数(在对象构造之后)被各个成员函数都可以调用,貌似C语言对全局变量的调用。
2) 和对象的生命周期相同,只要对象没有实效,对象内的成员变量就一直有效。
3) 类对象内的成员变量的生命开始时间是:对象定义时,也就是构造函数执行时。
4) 类对象内的成员变量的生命结束时间是:析构函数执行时。
15、拷贝构造:
1.形式:CStu(const CStu&)
本质即构造函数,参数是本类的常引用.
2.何时调用:
(1)新建一个对象,并将其初始化为同类现有对象
CStu a;
1) CStu a1(a);
2) CStu a2=a;
3) CStu a3=CStu(a); //用临时对象给对象赋值
4) CStu a4=new CStu(a1);
但先定义两个对象,之间的赋值不调用拷贝构造,
例如:CStu a1;
CStu a2;
a2=a1;
2)当程序生成副本时
1,函数参数传递对象的值
2,函数返回对象
3.有何功能:
默认的复制构造函数,逐个复制非静态成员(成员的复制成为浅复制)值,复制的是成员的值
16、友元函数
1、使用友元函数的优缺点
优点:能够提高效率,表达简单、清晰。
缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。
2.友元函数的使用
2.1友元函数的参数:
因为友元函数没有this指针,则参数要有三种情况:
2.1.1 要访问非static成员时,需要对象做参数;
2.1.2 要访问static成员或全局变量时,则不需要对象做参数;
2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;
2.2友元函数的位置
因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。

class INTEGER
{
  friend void Print(const INTEGER& obj);//声明友元函数
};
void Print(const INTEGER& obj)
{
   //函数体
}
void main()
{
  INTEGER obj;
  Print(obj);//直接调用
}
3.友元函数和类的成员函数的区别
3.1 成员函数有this指针,而友元函数没有this指针。
3.2 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
17、友元类
#include<iostream>
using namespace std;

class friendDemo1
{
public:
friendDemo1()
{
m_pri=10;
}
friend class friendDemo2;
friend void visitMpri(friendDemo1 &s);
private:
int m_pri;
};

class friendDemo2
{
public:
void visitDemo1(friendDemo1 &s);
};
//友元类的成员方法可以直接访问朋友的私有成员变量
void friendDemo2::visitDemo1(friendDemo1 &s)
{
cout << s.m_pri << endl;
}
//友元函数也可以直接访问朋友的私有成员变量
void visitMpri(friendDemo1 &s)
{
cout << s.m_pri <<endl;
}

int main()
{
friendDemo1 fd1;
friendDemo2 fd2;

fd2.visitDemo1(fd1);
visitMpri(fd1);
return 0;
}

 

 

C语言进化到C++ 的过程,是一个障眼法的发展过程。
1、 bool型变量:1个字节变量(和char一样大小),缺省赋值为true(1),false(0)
2、 引用型变量:让新申请的变量挂在原有同类型的内存地址上。引用的优点是书写更加流畅,是代码的逻辑更加清楚。
3、 命名空间:
a) 当工程代码量庞大时,由大量程序员编写的代码出现了重名函数,重名全局变量
b) 使用using namespace std ,语句在每处调用空间内函数不用加域名控制
c) 定义域(::)以后会在类成员函数中常用,
4、 C++输入输出
推荐使用 #include<iostream> uising namespace std;
不推荐使用#include <iostream.h>
cout 和cin比printf和scanf功能更加强大,自动识别类型。
不需要%d和%s等等。
5、 申请堆空间:
New和delete代替malloc和free,使书写更加流畅,尤其申请堆内数组更加直观。
例如://Stest *p=(Stest *)malloc(sizeof(Stest));
Stest *p=new Stest;
//Free(p)
delete p;

//int *p1=(int *)malloc(sizeof(int )*5);
Int *p1=new int [5];
delete []p1 不推荐使用 delete p1
注意:new的错误写法:int p1=new int(5)
6、 函数的默认参数
函数调用时,可以不指定的参数提供默认值。默认值可以在原型或者函数定义中给出,但不能在两个位置同时给出推荐在原型申明中指定默认值。
int add(int data1, int data2,int data3=9)
{
return data1 + data2 + data3;
}

int main()
{
int sum = add(1,2);
}
7、 内联函数:
代替:C语言的宏定义函数,实际也是C++的障眼法之一。编译时仍然按宏定义函数一样处理。
8、 C++由结构体struct升级为class
类内不但支持变量,还支持成员函数,是一个更加严重的障眼法,任何一个类的成员函数内部都隐藏形式参数一个变量叫this指针。
9、 struct和class的区别
struct 和class的唯一区别就是缺省权限不同,public.protected private
1)private:私有权限的成员变量和成员函数,只限于在本类内的成员函数调用;
2)public:共有权限的成员变量和成员函数,在类内和类外多能够被调用;
3)如果class内部的所有成员都是公开,就等于struct 了.
4)公司里开发时,struct往往用于纯数据的结构体,把class 当做多功能类的开发。
10、 C++支持重载函数,C语言不可以有名字相同的函数,
重载函数:函数名字相同,但是参数列表不同(类型和个数不完全相同)
递归函数:C语言和C++都支持
11、 构造函数:
一:
1) 构造函数是类的一种特殊成员函数,一般情况下,构造函数是专门用来初始化成员变量的,所以做好不要在构造函数中进行与对象的初始化无关的操作。
2) 构造函数的函数名一定与类名完全相同,而且没有返回值,(不是说返回值都是void或者int,而是不允许指定返回值)。
3) 构造函数的返回值如果制定了任何类型都是错误的,构造函数的功能是代替C语言对结构体对象初始化的的括号。
4) C语言对结构体成员初始化方式是使用大括号,如果该类(结构体)有构造函数禁止使用大括号初始化成员数据。
二:
构造函数的调用
1) 是在定义对象指定参数或者不指定参 数,都会自动调用构造函数,手工使用对象调用构造函数会出错。
2) 构造函数分为无参、有参和拷贝构造,定义了那种形式的构造函数,就以为只有那种对象定义方式。
3) 使用“=”来调用构造函数,调用单参数的构造函数而且单参数类型和“=”右边的类型相同。
4) 一般情况下“=”右边的类型没有适合单参数构造函数不能使用“=”构造。
5) 只有一种类型合适“=”右边构造函数,系统内部有缺省的拷贝构造函数,内部实现的是要体赋值。
12、 析构函数:
1) 析构函数可以手工调用,但是不推荐手工调用,只要是对象的生命周期结束时,会自动调用析构函数,
2) 析构函数名是在类名前加 ~ ,析构函数同样不能返回任何值,也必须没有函数参数,并且不能被重载,
3) 所以一个类可以有多个构造函数,却只能有一个析构函数,
4) 一般来说,每当创建一个对象时就会调用对象的构造函数,每当撤销一个对象就会调用该对象的析构函数。
13、 构造函数和析构函数的总结:
1) 无论是构造函数还是析构函数,我们都应该把他们视作是一种回调函数。
2) 构造函数和析构函数自身并不对类的成员数据做任何初始化或堆空间的清理工作。
3) 析构函数本身什么都不做,只是到了对象的空间将要销毁的时间点,提示程序员是否要编写一些代码来清理曾经申请过的堆空间。
4) 在析构函数中,程序员只需要考虑对申请过的堆空间进行释放,而本身对象占用的无论是栈空间还是全局空间系统都会自动清理的。
14、 类成员变量的生命周期:
1) 类成员函数(在对象构造之后)被各个成员函数都可以调用,貌似C语言对全局变量的调用。
2) 和对象的生命周期相同,只要对象没有实效,对象内的成员变量就一直有效。
3) 类对象内的成员变量的生命开始时间是:对象定义时,也就是构造函数执行时。
4) 类对象内的成员变量的生命结束时间是:析构函数执行时。
15、拷贝构造:
1.形式:CStu(const CStu&)
本质即构造函数,参数是本类的常引用.
2.何时调用:
(1)新建一个对象,并将其初始化为同类现有对象
CStu a;
1) CStu a1(a);
2) CStu a2=a;
3) CStu a3=CStu(a); //用临时对象给对象赋值
4) CStu a4=new CStu(a1);
但先定义两个对象,之间的赋值不调用拷贝构造,
例如:CStu a1;
CStu a2;
a2=a1;
2)当程序生成副本时
1,函数参数传递对象的值
2,函数返回对象
3.有何功能:
默认的复制构造函数,逐个复制非静态成员(成员的复制成为浅复制)值,复制的是成员的值
16、友元函数
1、使用友元函数的优缺点
优点:能够提高效率,表达简单、清晰。
缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。
2.友元函数的使用
2.1友元函数的参数:
因为友元函数没有this指针,则参数要有三种情况:
2.1.1 要访问非static成员时,需要对象做参数;
2.1.2 要访问static成员或全局变量时,则不需要对象做参数;
2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;
2.2友元函数的位置
因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。

class INTEGER
{
  friend void Print(const INTEGER& obj);//声明友元函数
};
void Print(const INTEGER& obj)
{
   //函数体
}
void main()
{
  INTEGER obj;
  Print(obj);//直接调用
}
3.友元函数和类的成员函数的区别
3.1 成员函数有this指针,而友元函数没有this指针。
3.2 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
17、友元类
#include<iostream>
using namespace std;

class friendDemo1
{
public:
friendDemo1()
{
m_pri=10;
}
friend class friendDemo2;
friend void visitMpri(friendDemo1 &s);
private:
int m_pri;
};

class friendDemo2
{
public:
void visitDemo1(friendDemo1 &s);
};
//友元类的成员方法可以直接访问朋友的私有成员变量
void friendDemo2::visitDemo1(friendDemo1 &s)
{
cout << s.m_pri << endl;
}
//友元函数也可以直接访问朋友的私有成员变量
void visitMpri(friendDemo1 &s)
{
cout << s.m_pri <<endl;
}

int main()
{
friendDemo1 fd1;
friendDemo2 fd2;

fd2.visitDemo1(fd1);
visitMpri(fd1);
return 0;
}

 

posted @ 2017-09-08 08:36  zwj鹿港小镇  阅读(365)  评论(0编辑  收藏  举报