目录
6. 全局变量,局部变量,const 变量,static 静态变量, 静态函数等问题
1. 输入,输出
#include <iostream>
//using namespace std;
int main()
{
std::cout<<"enter two numbers: "<<std::endl;
int v1,v2;
std::cin>>v1>>v2;
std::cout << "two num sum of " <<v1<<"+"<<v2<<" is:"<<v1+v2<<std::endl;
return 0;
}
2. new内存分配和delete 内存释放
new 内存分配
//动态分配内存空间
int *p=new int[10];
int *p=new int;
int *p=new int(1024);
string *q=new string[5];
//动态释放空间
delete [] p;
delete [] q;
3. 引用
引用可以看作一个已定义变量的别名
普通引用在声明时必须用其它的变量进行初始化,
引用作为函数参数声明时不进行初始化
引用在C++中的内部实现是一个常指针,因此引用所占用的空间大
小与指针相同
Type& name ——> Type* const name
int ival=1024;
int &refval=ival;
const int ival=1024;
const int &refval=ival;
void main01()
{
int a = 10; //c编译器分配4个字节内存。。。a内存空间的别名
int &b = a; //b就是a的别名。。。
a =11; //直接赋值
{
int *p = &a;
*p = 12;
printf("a %d \n",a);
}
b = 14;
printf("a:%d b:%d", a, b);
system("pause");
4. 内联函数
内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
内联函数在最终生成的代码中是没有定义的
C++编译器直接将函数体插入在函数调用的地方,因此,内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)
C++中内联编译的限制:
不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取址操作
函数内联声明必须在调用语句之前
inline const string &shorterString(const string &s1,const string &s2)
{
return s1.size()<s2.size()?s1:s2;
}
结论:
1)内联函数在编译时直接将函数体插入函数调用的地方
2)inline 只是一种请求,编译器不一定允许这种请求
3)内联函数省去了普通函数调用时压栈,跳转和返回的开销
5. typedef 给已有的类型进行重命名
typedef int int32;
int32 i=4;
6. 全局变量,局部变量,const 变量,static 静态变量,
静态函数等问题
一. const 基础知识
int main()
{
const int a;
int const b;
const int *c;
int * const d;
const int * const e ;
return 0;
}
Int func1(const )
初级理解:const 是定义常量==》const 意味着只读
含义:
//第一个第二个意思一样 代表一个常整形数
//第三个 c 是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//第五个 e 一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
Const 好处
//合理的利用 const,
//1 指针做函数参数,可以有效的提高代码可读性,减少 bug;
//2 清楚的分清参数的输入和输出特性
int setTeacher_err( const Teacher *p)
Const 修改形参的时候,在利用形参不能修改指针所向的内存空间
二. 全局变量与局部变量
#include <iostream>
int a;
int main()
{
float a;
a=3.14;
::a =6;
cout<<"local variable a="<< a <<endl;
cout<<"global variable a="<< ::a <<endl;
return 0;
}
结果:
local variable a=3.14
global variable a=6
7. 函数重载(Function Overload)
函数重载概念
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
函数重载的判断标准
函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
函数返回值不是函数重载的判断标准
int func(int x)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
int main()
{
int c = 0;
c = func(1);
printf("c = %d\n", c);
c = func(1, 2);
printf("c = %d\n", c);
c = func("12345");
printf("c = %d\n", c);
printf("Press enter to continue ...");
getchar();
return 0;
}
结果:
结论:
编译器调用重载函数的准则
轻松入门 实战应用 传智播客 C++课程
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败
最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
无法匹配所有候选者,函数未定义,编译失败
函数重载的注意事项
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的
8. try catch 异常处理
9. this 指针的使用
10. 命名空间
一.namespace,是指标识符的各种可见范围,例如:<iostream>和<iostream.h>
1)当使用<iostream.h>时,相当于在 c 中调用库函数,使用的是全局命名空间,也就是
早期的 c++实现;
2)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用 namespace std;
这样才能正确使用 cout。
二. namespace 的三种用法
1、直接指定标识符。例如 std::ostream 而不是 ostream。完整语句如下: std::cout <<
std::hex << 3.4 << std::endl;
2、使用 using 关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用 using namespace std; 例如: using namespace std;这样命名空间
std 内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句
轻松入门 实战应用 传智播客 C++课程
可以如下写: cout <<hex << 3.4 << endl;
三. C++命名空间编程
namespace NameSpaceA
{
int a = 0;
}
namespace NameSpaceB
{
int a = 1;
namespace NameSpaceC
{
struct Teacher
{
char name[10];
int age;
};
}
}
int main()
{
using namespace NameSpaceA;
using NameSpaceB::NameSpaceC::Teacher;
printf("a = %d\n", a);
printf("a = %d\n", NameSpaceB::a);
NameSpaceB::NameSpaceC::Teacher t2;
Teacher t1 = {"aaa", 3};
printf("t1.name = %s\n", t1.name);
printf("t1.age = %d\n", t1.age);
system("pause");
return 0;
}
结果:
a = 0
a = 1
t1.name = aaa
t1.age = 3
结论:
1) 当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用 namespace std;
这样才能正确使用 cout。若不引入 using namespace std ,需要这样做。std::cout。
2) c++标准为了和 C 区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
3) C++命名空间的定义: namespace name { … }
4) using namespace NameSpaceA;
5) namespce 定义可嵌套