c++笔记1
2017-07-25 19:18
106 查看
1.引用:可以认为是一个已定义的变量的别名
Type& name = var
eg:int a = 4;
int& b = a;
必须在声明的时候用变量初始化 int& b;b=a;×
在一些场合可以代替指针,比指针具有更好的可读性和实用性
eg:
void swap(int& a,int& b)
{
int t = a;
a = b;
b = t;
}
swap(a,b);
void swap(int* a,int* b)
{
int t = *a;
*a = *b;
*b = t;
}
swap(&a,&b);
2.const引用:让变量只读(不能作左值)
const Type& name = var;
eg:
int a = 4;
const int& b = a;
b=5;×
使用常量const 引用初始化后将生成一个只读变量
引用在c++内部是常量指针,所占用空间大小与指针相同
引用作为返回值时:
①作为局部变量的返回值,不能作左值
②作为全局/静态变量的返回值,能作左值能作右值
3.内联函数:可用于替代宏代码块
inline int fun(int a,int b)
{
......
return ;
}
最终生成的代码是没有定义的
编译器直接将函数体插入调用的地方
无调用开销
只是对编译器的请求,请求不成功将作为普通函数
限制:不能有循环
不能有过多的条件判断语句
函数体不能过大
不能对函数进行取址
内联声明必须在调用前
4.重载:同一关键字搭配不同的上下文含义不同
函数重载:同一函数名定义不同函数
int fun(int x){......}
int fun(int a,int b){......}
int fun(const char* s){......}
重载必须至少满足以下一点:参数个数不同/参数类型不同/参数顺序不同
返回值不能作为重载依据
5.c与c++相互调用
#ifdef _cplusplus
extern "c"
{
#endif
......
#ifdef _cpluscplus
}
#endif
6.动态内存分配:new 删除 : delete
变量申请:Type* pointer = new Type;......delete pointer;
数组申请: Type* pointer = new Type
;......delete[] pointer;
eg:
int* p = new int;
*p = 5;
*p = *p+10;//*p=15;
delete p;
p = new int[10];
for(int i=0;i<10;i++)
{
p[i]=i;
}
delete[] p;
new 关键字初始化:int* p = new int(1);char* p = new char('c');
7.命名空间
namespace name{......}
eg:namespace first
{int i=0;}
namespace second
{
int i = 1;
namespace internal
{
struct P
{
int i;
int y;
}
}
}
命名空间的使用:
①使用整个命名空间:using namespace name;
②使用命名空间中的变量:using namespace::variable;
③使用默认命名空间中的变量: ::variable;
eg:using namespace first;
printf("i = %d";i);//i=0
using second::internal::P;
printf("second::i = %d",second::i);//i=1
P p = {2,3};//p.x = 2;p.y = 3;
8.强制类型转换
①static_cast:基本类型间的转换,不能用于指针
有继承类对象间的转换和类指针间的转换
eg:
int i = 0;
char c = 'c';
int* p = &i;
char* pc = &c;
c = static_cast<char>(i);√
pc = static_cast<char*>(pi);×
②const_cast:用于去除变量的const属性
eg:
const int& j = 1;
int& k = const_cast<int&>(j);
const int x = 2;
int& y = const_cast<int&>(x);
k = 5;y = 3;
//j = 5;k = 5; x = 2; y = 3;
③reinterpret_cast:用于指针类型间的强制转换
用于整数和指针间强制转换
eg:
int i = 0;
char c = 'c';
int* pi = &i;
int* pc = &c;
pc = reinterpret_cast<char*>(pi);
pi = reinterpret_cast<int*>(pc);//可以这样转换,但是没意义
④dynamic_cast:用于类层次的转换,类之间的转换
Type& name = var
eg:int a = 4;
int& b = a;
必须在声明的时候用变量初始化 int& b;b=a;×
在一些场合可以代替指针,比指针具有更好的可读性和实用性
eg:
void swap(int& a,int& b)
{
int t = a;
a = b;
b = t;
}
swap(a,b);
void swap(int* a,int* b)
{
int t = *a;
*a = *b;
*b = t;
}
swap(&a,&b);
2.const引用:让变量只读(不能作左值)
const Type& name = var;
eg:
int a = 4;
const int& b = a;
b=5;×
使用常量const 引用初始化后将生成一个只读变量
引用在c++内部是常量指针,所占用空间大小与指针相同
引用作为返回值时:
①作为局部变量的返回值,不能作左值
②作为全局/静态变量的返回值,能作左值能作右值
3.内联函数:可用于替代宏代码块
inline int fun(int a,int b)
{
......
return ;
}
最终生成的代码是没有定义的
编译器直接将函数体插入调用的地方
无调用开销
只是对编译器的请求,请求不成功将作为普通函数
限制:不能有循环
不能有过多的条件判断语句
函数体不能过大
不能对函数进行取址
内联声明必须在调用前
4.重载:同一关键字搭配不同的上下文含义不同
函数重载:同一函数名定义不同函数
int fun(int x){......}
int fun(int a,int b){......}
int fun(const char* s){......}
重载必须至少满足以下一点:参数个数不同/参数类型不同/参数顺序不同
返回值不能作为重载依据
5.c与c++相互调用
#ifdef _cplusplus
extern "c"
{
#endif
......
#ifdef _cpluscplus
}
#endif
6.动态内存分配:new 删除 : delete
变量申请:Type* pointer = new Type;......delete pointer;
数组申请: Type* pointer = new Type
;......delete[] pointer;
eg:
int* p = new int;
*p = 5;
*p = *p+10;//*p=15;
delete p;
p = new int[10];
for(int i=0;i<10;i++)
{
p[i]=i;
}
delete[] p;
new 关键字初始化:int* p = new int(1);char* p = new char('c');
7.命名空间
namespace name{......}
eg:namespace first
{int i=0;}
namespace second
{
int i = 1;
namespace internal
{
struct P
{
int i;
int y;
}
}
}
命名空间的使用:
①使用整个命名空间:using namespace name;
②使用命名空间中的变量:using namespace::variable;
③使用默认命名空间中的变量: ::variable;
eg:using namespace first;
printf("i = %d";i);//i=0
using second::internal::P;
printf("second::i = %d",second::i);//i=1
P p = {2,3};//p.x = 2;p.y = 3;
8.强制类型转换
①static_cast:基本类型间的转换,不能用于指针
有继承类对象间的转换和类指针间的转换
eg:
int i = 0;
char c = 'c';
int* p = &i;
char* pc = &c;
c = static_cast<char>(i);√
pc = static_cast<char*>(pi);×
②const_cast:用于去除变量的const属性
eg:
const int& j = 1;
int& k = const_cast<int&>(j);
const int x = 2;
int& y = const_cast<int&>(x);
k = 5;y = 3;
//j = 5;k = 5; x = 2; y = 3;
③reinterpret_cast:用于指针类型间的强制转换
用于整数和指针间强制转换
eg:
int i = 0;
char c = 'c';
int* pi = &i;
int* pc = &c;
pc = reinterpret_cast<char*>(pi);
pi = reinterpret_cast<int*>(pc);//可以这样转换,但是没意义
④dynamic_cast:用于类层次的转换,类之间的转换
相关文章推荐
- Linux Shell 学习笔记
- Hadoop源码分析笔记(十五):名字节点--启动和停止
- [笔记]VS2005中Debug遇到找不到msvcr80.dll的问题的解决办法
- vundle+window+GVim的配置笔记
- java新手笔记7 找最小、最大、排序
- 数据结构学习笔记之线性结构栈
- QTP11.0 学习笔记(一)
- Objective-C 学习笔记9 使用NSKeyedArchiver 归档
- 《剑指Offer》学习笔记--面试题65:滑动窗口的最大值
- MySQL基础笔记(一) SQL简介+数据类型
- Spring学习笔记 使用XML配置实现Bean的auto-wiring (自动绑定)
- NodeJs新手学习笔记练习项目大纲 推荐
- Swift学习笔记之变量与常量声明
- Java学习笔记1
- xdebug和komodo学习笔记
- linux内核学习笔记之——list_for_each_entry
- 设计模式学习笔记(二:观察者模式)
- opencv2笔记05-局部二值模式(LBP)
- DevIL的学习笔记
- Java学习笔记--整合数据库