c++ 基础总结 锦集

 char cal1[] = {'C','+','+'};//维数是3
 char cal2[] = "c++";//维数是4
//char cal3[] = cal1;//不能用一个数组初始化另一个数组
//char &cal4[] = {'C','+','+'};//c++不允许数组引用
----------------------------------------------------------
string *ps = new string("Hello World!");
delete ps;//此时ps为空悬指针,需将ps = 0;
ps = 0//至此彻底收回 动态内存
int ival = 1024;
void *pv;
int *pi = &ival;
int *pi1;
pv = pi;
//pc = pv;//不存在从*void型指针到特殊类型的指针之间的自动转换
pi1 = static_cast<int *>(pv);
cout<<*pi1<<endl;
----------------------------------------------------------
string str("tianshi");
str.erase(1,string::npos);//跟str.erase(1)效果一样,删除位置1以后所有的字符
----------------------------------------------------------
void putValues(int (&arr)[4]);//当参数声明为数组引用时,长度成为参数和实参类型的一部分,需要检查
int arr[] = {1,2,3};
//putValues(arr);//错误,数组长度不匹配,实参为3,形参为4
----------------------------------------------------------
//数组永远不会按值传递,只会传递指向一个数组的指针
//三个等价的putValues()声明
void putValues(int *);
void putValues(int []);
void putValues(int [4]);
----------------------------------------------------------
//宏定义的典型错误
#include "stdafx.h"
#include <iostream>
#define min(a,b) ((a) < (b) ? (a) : (b))
using namespace std;
const int size = 10;
int ia[size];
int _tmain(int argc, _TCHAR* argv[])
{
int elem_cnt = 0;
int *p = &ia[0];
while(min(p++,&ia[size]) != &ia[size])//p++执行了两次
++elem_cnt;
cout<<"elemt_cnt:"<<elem_cnt<<endl;//输出值为5,错误
cout<<"expecting:"<<size<<endl;

return 0;
}
----------------------------------------------------------
template <class Type,int size>
void min(Type (&r_array)[size])
{
cout<<r_array[0]<<endl;
}

//以下模板使用时错误的
//假如有个函数定义 如下
void f(int i_array[2])
{
min(i_array);//错误的,因为int i_array[2] 为int* 类型的,模板不知道此处为一个数组
}
//以下为正确使用方式
void f()
{
int i_array[2] = {1,2};
min(i_array);//此处调用正确
}
----------------------------------------------------------
函数模板设计者必须确保
1、为模板定义中用到的、所有不依赖于模板参数的名字“先”提供声明
2、为模板定义中用到的、所有依赖于模板参数的名字,在模板实例化之前提供声明
----------------------------------------------------------
如果函数模板存在于名字空间中,则当为该模板显示特化时,有以下两种方式:
1、重新打开名字空间的定义并加上该特化的定义
2、通过用外围名字空间名 来限定修饰名字空间成员名
例如:template<> int 空间名字::min<int>(int *array, int size){/*.......*/}

----------------------------------------------------------
catch(...)捕获所有的异常对象
异常声明是函数接口的一部分,它必须在头文件中的函数声明上指定。
异常规范保证该函数不会抛出任何没有出现在异常规范中的异常。

例如:void pop( int &) throw(popOnEmpty);
对于pop()的调用,保证不会抛出任何popOnEmpty类型之外的异常。
----------------------------------------------------------
//当带有异常规范的函数指针被初始化(或被赋值)时,对于用作初始值的指针类型有一些限制。
//这两个指针的异常规范不必完全一样,但是用作初始值的指针异常规范必须与被初始化的指针异常规范一样或更严格。
//例如
void recoup(int, int) throw(exceptionType);
void no_problem() throw();
void doit(int , int) throw(dtring,exceptionType);
//正确,异常规范一样严格
void (*pf1)(int, int) throw(exceptionType) = &recoup;
//正确,no_problem() 的异常规范 比 pf2 更严格
void (*pf2)() throw(string) = &no_problem;
//错误,doit() 没有 pf3 严格
void (*pf3)(int,int) throw(string) = &doit;
----------------------------------------------------------
#include "stdafx.h"
#include <iostream>
using namespace std;
#define min(a,b) ((a) < (b) ? (a) : (b))//没执行一次p++两次(!!!!)

const int size = 10;
int ia[size];

int _tmain(int argc, _TCHAR* argv[])
{
int elem_cnt = 0;
int *p = &ia[0];

//计数数组元素的个数
while( min(p++,&ia[size]) != &ia[size])
++elem_cnt;

cout<< "elem_cnt :" <<elem_cnt<<endl;//输出:5
cout<<"expecting :" <<size<<endl;//输出:10
return 0;
}
原文地址:https://www.cnblogs.com/handongdong/p/2223744.html