c++函数重载,命名空间,动态内存分配,引用,输入输出,函数带默认参数等

目录

1.函数重载(C++中重载,重写,覆盖有什么区别)

 2.命名空间(名称空间)(C++中static和const的用法?  C++中static和C语言中static用法有什么不一样)

 3.动态内存分配(给指针分配堆空间)(new和malloc区别)

4. 引用(重点重点)(引用的特点? 引用和指针有什么区别?)

 5.输入输出

6.函数带默认参数



1.函数重载(C++中重载,重写,覆盖有什么区别)

  1.概念(什么是函数重载)
                C++允许在同一个程序中出现n个不同版本的同名函数
     作用:
                同一个接口,有不同的表现形式
                          add,不同的表现 --》两个整数
                                                           两个小数
                                                           三个整数

   2.函数重载的底层原理(编译器如何区分究竟使用哪个版本的同名函数)
             编译器会依据程序员传递的实参类型,实参个数自动匹配对应版本的add

  3.特点
            第一点:函数重载,所有的函数必须同名
            第二点:函数重载,参数的类型或者个数至少要有一个是不同的
            第三点:函数重载,只关心参数的类型以及个数,不关心返回值类型
                         函数的返回值类型不同,不能作为重载的依据

#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);
	
	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqb_newfarmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值