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;
}
随机推荐
- DAY03、基本数据类型和运算符
一.基本数据类型的使用 1.整型int: 作用:用来记录年龄.等级.数量 定义:age=18 使用:数学运算与比较运算: 例:print(10>3) print(10/3) 2.浮点型float ...
- WEB测试重点--(转载)
1.功能测试: 所实现的功能是否和需求一致: js错误 页面链接错误-空链接.死链接.错误链接 按钮无效 未实现功能 报错提示信息不准确或不友好 数据库访问错误 sql注入 文档上传下载问题 -未实现 ...
- Http请求笔记
1 HTTP请求报文组成: 请求行:请求方法 url 协议版本 请求头:报文头-属性名:属性值 Accept属性告诉服务端-客户端接受什么类型的响应,可为一个或多个mime类型值 Cookie:服务端 ...
- Java之XML操作:从XML中直接获取数据
本文介绍如何将数据记录在XML文件中,然后通过DOM4J直接从XML中读取到数据. 依赖包: <dependency> <groupId>dom4j</groupId&g ...
- Serialize a Long as a String
今天在写接口的时候,用postman测试,返回数据与数据库一一对应,但是给前端返回的结果,除了主键id以外,其他都一样,如下 postman: { "unitPrice": nul ...
- WGS84,GCJ02, BD09坐标转换
public class Gps { private double wgLat; private double wgLon; public Gps(double wgLat, double wgLon ...
- bzoj1861
bzoj1861[ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本 ...
- python---反射详解
反射即想到4个内置函数分别为:getattr.hasattr.setattr.delattr 获取成员.检查成员.设置成员.删除成员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- JVM安全点操作与测试小记
JVM的安全点学习与代码测试 监控安全点(打印JVM停顿时间,不止GC,处理毛刺): -XX:+PrintGC -XX:+PrintGCApplicationStoppedTime 取消偏向锁: -X ...
- BZOJ2428[HAOI2006]均分数据——模拟退火
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...