目录
2.命名空间(名称空间)(C++中static和const的用法? C++中static和C语言中static用法有什么不一样)
3.动态内存分配(给指针分配堆空间)(new和malloc区别)
4. 引用(重点重点)(引用的特点? 引用和指针有什么区别?)
1.函数重载(C++中重载,重写,覆盖有什么区别)
1.概念(什么是函数重载)
C++允许在同一个程序中出现n个不同版本的同名函数
作用:
同一个接口,有不同的表现形式
add,不同的表现 --》两个整数
两个小数
三个整数2.函数重载的底层原理(编译器如何区分究竟使用哪个版本的同名函数)
编译器会依据程序员传递的实参类型,实参个数自动匹配对应版本的add3.特点
第一点:函数重载,所有的函数必须同名
第二点:函数重载,参数的类型或者个数至少要有一个是不同的
第三点:函数重载,只关心参数的类型以及个数,不关心返回值类型
函数的返回值类型不同,不能作为重载的依据
#include <iostream>
using namespace std;
int add(int a,int b)
{
cout<<"add版本1调用了"<<endl;
return a+b;
}
int add(int a,int b,int c)
{
cout<<"add版本2调用了"<<endl;
return a+b+c;
}
double add(double a,double b)
{
cout<<"add版本3调用了"<<endl;
return a+b;
}
double add(int a,double b)
{
cout<<"add版本4调用了"<<endl;
return a+b;
}
int main()
{
int n1=88;
int n2=77;
int n3=66;
int n4=55;
double m1=45.6;
double m2=52.3;
//调用不同版本的add
//add(n1,n2); //add(int,int)编译器会依据程序员传递的实参类型自动匹配对应版本的add
//add(m1,m2);//add(double,double)编译器会依据程序员传递的实参类型自动匹配对应版本的add
//add(n1,m1);//add(int,double)编译器会依据程序员传递的实参类型自动匹配对应版本的add
//add(n1,n2,n3);//add(int,int,int)编译器会依据程序员传递的实参类型自动匹配对应版本的add
//负面--》错误的例子
add(m1,n1);//add(double,int)
add(n1,n2,n3,n4);//add(int,int,int,int)
}
2.命名空间(名称空间)(C++中static和const的用法? C++中static和C语言中static用法有什么不一样)
1.作用
跟C语言中static的作用类似,用来防止名字冲突
static修饰全局变量:表示限制了这个全局变量作用范围
2.命名空间的语法
namespace 名称空间的名字
{
名称空间里面的内容};
名称空间中可以包含如下内容:
变量
结构体
函数的定义
类的定义
3.使用命名空间
写法一: 命名空间的名字::变量名
tt::n //我要使用命名空间tt里面的变量n
写法二: 使用using声明
using namespace tt;
好处:后面的代码可以不必写限定符4.重新认识std
std是系统中iostream头文件里面定义的一个名称空间
namespace std
{
cout;
cin;
endl;
};
std::cout<<"hello"<<std::endl;
#include <iostream>
int n=77;
namespace tt
{
int n=99;
}
using namespace tt;
int main()
{
std::cout<<"hello world"<<std::endl;
//我要使用n 二义性(歧义)
std::cout<<"n is: "<<n<<std::endl; //此时代码编译出错,全局变量n跟tt::n有冲突,有歧义
}
3.动态内存分配(给指针分配堆空间)(new和malloc区别)
1.分配堆空间
C语言: malloc calloc realloc申请堆空间
free 释放堆空间
C++新增了两个关键字: new delete
new 申请堆空间
delete 释放堆空间2.分配释放堆空间几种写法
写法一:申请单个变量大小的堆空间
int *p=new int; //等价于 int *p=malloc(sizeof(int))
delete p;
写法二:申请多个变量大小的堆空间
int *p=new int[10]; //等价于 int *p=malloc(10*sizeof(int));
delete []p;
写法三:申请单个变量大小的堆空间,顺便赋值
int *p=new int(10); //等价于 int *p=malloc(sizeof(int)) *p=10;
delete p;
4. 引用(重点重点)(引用的特点? 引用和指针有什么区别?)
1.回顾C语言中传参
C语言传递参数只有两种情况:传值 传地址
C++传递参数有三种情况: 传值 传地址 传引用
2.引用的概念
引用就是变量的一个别名
比如:我叫张建国 别名(绰号) 张三3.语法规则
定义引用: 类型名 &引用的名字=变量名
int a=99;
int &b=a; //定义了一个int类型的引用,名字叫做b,b指向a(b是a的别名)
引用常见的几种分类:
第一种:指向普通变量的引用
float a=45.6;
float &b=a;
第二种:指向指针的引用
int a=99;
int *p=&a;
int *&b=p;
第三种:指向数组的引用
int buf[10];
typedef int array[10]; //为了方便大家理解
array &b=buf;
第四种:const修饰的引用叫做常引用
常引用表示这个引用只能访问变量的值,不可以修改变量的值
const int &b=a;
总结:任何引用,你在使用的时候,变量如何用,引用就照着写就可以了
4.引用的特点
特点一:引用就是变量的别名,引用没有占用额外的内存空间,引用的内存空间就是它所指向那个变量的内存空间
特点二:引用必须在定义的时候立马初始化
特点三:引用具备了传值和传地址的双重属性
实际开发中:引用往往用来作为函数的形参
好处:节约内存空间,提高程序的运行效率
特点四:引用初始化以后不可以被改变
#include <iostream>
using namespace std;
int a=99;
int b=56;
int *p=&a;
p=&b;
int main()
{
int a=99;
int b=56;
int &c=a; //一个引用初始化以后,不能被改变
cout<<c<<endl; //99
c=b; //改变c(a)的值
cout<<c<<endl; //56
cout<<a<<endl; //56
c=78;
cout<<a<<endl; //78
cout<<b<<endl; //56
}
5.输入输出
1.输出
C语言:printf需要用到各种不同格式输出符号 %d %f %s
C++: cout<<变量的名字;
情况一:打印单个变量
cout<<变量名<<endl;
情况二:打印多个变量
cout<<变量1<<变量2<<endl;
注意的问题:
第一个: cout打印地址(指针),如果该指针是char *,那么cout默认是当成字符串输出
如果该指针不是char *,那么cout当成地址输出
第二个: cout如果要打印char *的地址,必须把这个指针强转(一般都是强转成int *)
2.输入
C++: cin>>变量名; //注意变量不要取地址3.g++编译提示的错误
错误提示很恐怖,只需要看最前面的几行红色部分即可
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a=99;
int *p1=&a;
float b=89.9;
float *p2=&b;
char buf='b';
char *p3=&buf;
char d[10]="hello";
char *p4=d;
//打印各种地址
cout<<"a的地址: "<<&a<<" "<<p1<<endl;
cout<<"b的地址: "<<&b<<" "<<p2<<endl;
cout<<"buf的地址: "<<&buf<<" "<<p3<<endl; //char *默认当成字符串打印
cout<<"d的地址: "<<d<<" "<<p4<<endl; //char *默认当成字符串打印
//解决char *打印地址的问题
//char *指针如果要打印地址值,必须强转
cout<<"buf的地址:"<<(int *)p3<<endl;
printf("%p\n",p3);
cout<<"d的地址:"<<(int *)p4<<endl;
printf("%p\n",p4);
}
6.函数带默认参数
函数带默认参数
=================================
1. 语法规则
返回值 函数名(形参1=默认值,形参2=默认值,形参3=默认值)
{
}
规则一:调用这个函数,传递实参必须从左到右连续,中间不能间断
规则二:带默认参数的函数,你在写默认值的时候,必须从右到左连续2. 默认参数的好处
调用函数的时候,提供了很灵活的写法,程序员可以依据自己的需求灵活传递参数 (不传递参数就用默认的,传递就用程序员的)
举例:
95%情况 /dev/video7 5% /dev/video4/5/6
#include <iostream>
using namespace std;
//定义函数,用来设置矩形的宽和高
int setwh(float w,float h=1.5)
//int setwh(float w=1.2,float h) //错误的,不满足默认值从右到左连续
{
cout<<"矩形的宽是: "<<w<<endl;
cout<<"矩形的高是: "<<h<<endl;
}
//定义函数求三个整数的和
int myadd(int n1,int n2=20,int n3=30)
int myadd(int n1,int n2,int n3=30)
//int myadd(int n1=10,int n2,int n3=30) //错误的,不满足默认值从右到左连续
//int myadd(int n1,int n2=20,int n3) //错误的,不满足默认值从右到左连续
//int myadd(int n1=10,int n2,int n3) //错误的,不满足默认值从右到左连续
{
cout<<"n1 "<<n1<<" n2 "<<n2<<" n3 "<<n3<<endl;
cout<<n1+n2+n3<<endl;
}
int main()
{
setwh(2.3);
setwh(3.3,1.9);
}