1、命名空间
a.为什么要有命名空间?
解决命名冲突问题。
b.怎么定义命名空间?
namespace(关键字)
格式:namespace 命名空间的名字{
//命名空间的成员
//成员可以是函数也可以是变量
} //此处无分号
demo: namespace my_name_sp{
int num;
char ch;
void fun()
{
printf("fun\n");
}
} //此处无分号
c.怎么使用命名空间中的成员?
命名空间名字::访问的成员
demo:my_name_sp::fun();
my_name_sp::num = 10;
d.作用域运算符::
可以指示变量的位置,可以指定访问的变量的位置
1.当全局变量和局部变量重名时,可以使用作用域运算符访问全局变量
::num //访问的全局num
注意:即使支持访问全局变量,但是最好不要有全局变量,即使定义全局变量,也最好不要和局部变量重名。
2.命名空间其实可以理解为自定义的作用域
2、输入输出
a.
C++的输出输入是由对象完成的,在iostream流中有4个对象完成输入输出功能
常用的两个为cin和cout
b.什么是流?
流强调的是,数据是不间断的,有序的
随着时间流逝,数据的输入与输出是有序的
c.cout 标准输出
cout结合输出运算符<<完成输出的功能。
可以做连续的多个输出操作,多个输出时每个输出都要使用<<
可以使用\n(\newline)完成换行功能,也可以使用endl完成换行。(endline)
demo:
cout<<"hello\n";
int a=10; cout<<a;
char *str="hello"; cout<<str;
cout<<str<<"\n";
d.cin 标准输入
cin结合输入运算符>>完成输入的功能。(要有足够的空间)
可以做连续的多个输入操作,多个输出时每个输出都要使用>>
cin不会对数据是否越界做检查
cin遇到空格、换行、回车后会停止工作。
cin.getline(str,sizeof(str));该函数可以获取一行数据,遇到\n停止工作,可以对数据长度做限制,但是不会读取\n
demo:
int num;
cin>>num;
char str[100];
cin>>str;
hello world
3.结构、联合和枚举名可直接作为类型名
C、c++构造数据类型
C:
struct 、union 、enum
struct stu
{
char *name;
int age;
};
struct stu a;
a是变量名,struct stu类型名
typedef struct stu
{
char *name;
int age;
}STU;
STU ==== struct stu
C++:
stu a; //结构名作为类型名
对象:编译器为之分配了存储空间的变量。a
类:具有共性的实体的抽象,自定义的数据类型。stu
4.const修饰符
C++:
a.const修饰的量为常量,必须要进行初始化
b.const修饰的常量,其值恒定,任何手段无法修改,存在文字常量区
c.当对const修饰的常量进行取地址操作时,编译会在栈区中开辟一块新的空间,其值为常量的值。
d.const型的数据不可用普通指针进行随意指向,如果要指向,请加强制类型转换。
5.const和指针结合情况
const和指针结合时,可以按照优先级分析,分析时将数据类型去掉,const修饰的是之后所有的数据
a.指向常量的指针变量:
const char *str1;
char const *str3;
const *str1; *str1是常量,不可变,str1是变量,可变
b.常(量)指针
char * const str2;
*const str2; str2是常量,不可变,*str2是变量,可变
c.指向常量的常指针
const char * const str4;
const * const str4; str4, *str4皆为常量,均不可变。
6.内联函数
a.函数调用的过程
void fun(int a)
{}
main()
int a;
fun(10);
int b;
b.内联函数
使用inline关键字可以声明内联函数,内联函数在调用时会进行替换,没有函数调用过程中的资源消耗。可以代替宏函数的使用。
注意:1.内联函数声明后不一定有效,只能将函数体较小,
且没有递归、循环以及复杂选择分支结构才可能会有效。
2.如果一个函数,函数体较小且没有递归、循环以及复杂选择分支结构,调用较频繁
即使没有声明为内联函数,C++的编译器也可以将其当做内联函数操作。
7.带有缺省参数的函数
a.定义:
在声明函数原型时,可为一个或多个参数指定缺省参数值,以后调用此函数,若省略其中某一参数,C++自动地以缺省值作为相应参数的值。例如函数原型说明为:
demo:
int special(int x=5,float y=5.3);
当进行函数调用时,可以有以下几种形式:
1) special(100,79.8); // x=100,y=79.8
2) special(25); // x=25,y=5.3
3) special();
注意:
1.缺省参数的设置必须从右到左进行。
2.必须函数调用过程中保证每个参数都进行赋值才可以。
3.带有缺省参数的函数仅在声明时有效
8.函数重载
a.什么是函数重载?
将多个函数使用同一函数名命名的情况就是函数重载。
b.函数重载需要有什么条件?
1.多个函数功能类似时可以考虑使用函数重载。
2.函数参数类型、或者个数、或者二者皆不同,可以使用函数重载。
3.返回值不能作为函数重载的标志
4.函数重载和带缺省参数的函数结合在一起时,要小心使用。
void fun(int a);
void fun(int a,int b=10);
fun(100); //此函数调用无法区分到底掉的哪个函数。
9.强制类型转换
c: (待转换的类型)变量名
c++照常可以使用上述方法。
int a; float b; a=(int )b
a=int(b);
10.new和delete运算符
a.new
1.new在为简单变量分配内存的同时进行初始化
new 数据类型(初值)会返回堆中申请的空间首地址。
如:int *p; p=new int(90);
2.newy运算符可以为数组申请空间
new 数组元素的类型[元素的个数]会返回堆中申请的空间首地址。
int *p = new int[10];
new和malloc的区别:
new在申请内存时可以进行初始化操作。
3.delete
释放空间时,只需delete后加上空间的首地址即可,delete p;
释放数组时格式为delete []q;
11.引用
a.什么是变量?
int a =10;
在内存申请了4个字节的空间其首地址为0x11223344,在这4个字节的内存中存储的值为10,
为了方便访问这块内存,我给它起了个名字叫做a(变量名).
int *p = &a;
b.什么是引用?
引用,就是别名。
int a = 5;
int &b = a; //a就是b,b就是a
c.引用需要注意的内容
1.引用必须要初始化
2.引用可以间接使用
3.引用的对象初始化完成后不可修改。
d.引用有什么用?
1.可以作为函数参数
2.可以作为函数返回值
引用作为函数返回值可以返回全局变量、静态变量、其他生命周期未结束的变量,不可返回局部变量
实质:简化指针操作,提高效率
#include <iostream>
#include <stdio.h>
using namespace std;
char *fun(char str[20])
{
// char *str = "hello world";
//char str[20] = "hello world";
printf("sizeo=%d\n",sizeof(str));
return str;
}
//引用作为函数返回值
int& fun(int &a)
{
return a;
}
int main(int argc, char *argv[])
{
int a = 10;
int c = fun(a);
printf("%d\n",c);
return 0;
}