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;
}
随机推荐
- python RSA 加密与签名
PyCrypto装起来就简单多了,我是直接 sudo easy_install pycrypto 直接搞定的 先生成rsa的公私钥:打开控制台,输入 openssl 再输入 genrsa -out p ...
- TField OnValidate 事件
Occurs just before the data is written to the record buffer. Write an OnValidate event handler to va ...
- Lodop的JS模版代码、文档式模版 生成加载赋值博文索引
Lodop获取全部JS代码,传统JS模版的生成.LODOP设置打印设计返回JS代码是变量 LodopJS代码模版的加载和赋值 Lodop生成文档式模版 LodopJS文档式模版的加载和赋值 由于加载J ...
- Membership 介绍
ASP.NET成员资格为您提供了验证和存储用户凭据的内置方式.因此,ASP.NET成员可以帮助您管理网站中的用户身份验证.您可以使用ASP.NET表单身份验证使用ASP.NET成员身份,方法是使用AS ...
- 本科理工男如何学习Linux
我是一个本科学电子的理工男,但是一直对计算机感兴趣,所以平时自己在课下喜欢学一些与计算机有关的东西.由于对计算机感兴趣,所以后来我参加了学校的计算机社团,在那里接受一些培训和指导.当时在社团里看到师兄 ...
- 利用kali破解wifi密码
准备工具 1.笔记本 2.USB无线上网卡(必备) 3.kali系统 4.密码字典 第一种方法 暴力破解法 何为暴力破解呢,其实就是一个一个密码去试,直到正确的密码. 现在的wifi一般加密都是: 1 ...
- npm、webpack、vue-cli
Node.js npm 什么是Node.js 以及npm 简单的来说 Node.js 就是运行在服务端的JavaScript,基于Chrome V8 引擎的. npm 是Node.js 的包管理 ...
- Goldbach's Conjecture POJ - 2262 线性欧拉筛水题 哥德巴赫猜想
题意 哥德巴赫猜想:任一大于2的数都可以分为两个质数之和 给一个n 分成两个质数之和 线行筛打表即可 可以拿一个数组当桶标记一下a[i] i这个数是不是素数 在线性筛后面加个装桶循环即可 #inc ...
- ionic更改端口号
—— 重新指定端口号为8888 serve [options] ............................... 启动本地服务器进行开发测试 dev/testing [--console ...
- linux命令:查看系统版本
debian系统 (1) lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debia ...