C++基础
BYR_jiandong
这个作者很懒,什么都没留下…
展开
-
strlen和sizeof的区别
eg1、char arr[10] = "Hello"; int len_one = strlen(arr); int len_two = sizeof(arr); cout 输出结果为:5 and 10 点评: sizeof返回定义arr数组时,编译器为其原创 2014-11-08 18:42:51 · 438 阅读 · 0 评论 -
MFC中调用控制台CMD进行输出
简单方法:添加头文件:#include #include 添加代码:AllocConsole(); freopen("CONOUT$","w",stdout); freopen("CONIN$","r",stdin);亲测有效。转载 2015-05-08 16:28:54 · 3157 阅读 · 0 评论 -
C++11 的一些有用的特性1 VS2012可支持
auto 关键字: 用于定义变量,编译器可以自动判断变量的类型。 auto i = 100; auto p = new A(); auto k = 34343LL; map> mp;for (auto i = mp.begin();i!= mp.end();++i) { coutfirstsecond;}auto 关键字可以解决模板返回值的类型原创 2015-10-21 09:38:27 · 613 阅读 · 0 评论 -
c++ 11 异常处理 北京大学C++程序设计实习公开课
需要进行异常处理的情况:异常处理的思路:1、把异常和函数的接口分开,并且能够区分不同的异常2、在函数体外捕获所发生的异常,并提供更多的异常信息异常处理:1、在函数内发生异常,可以在函数内自己处理2、在函数内发生的异常,可以在函数外,让调用者处理。3、抛出异常,其实就是抛出对象,所以,可以自己定义类对象来进行抛出。C++ 进行异常处理就原创 2015-10-23 09:20:33 · 704 阅读 · 0 评论 -
C++ 11 强制类型转换 北京大学程序实习公开课
类型转换是有风险的:1、浮点型转换成整型就会造成精度损失,在数值计算中,要非常小心,对精度非常有要求。2、基类指针转换成派生类指针风险非常大。以前类型转换,就直接用int(a),double(b)等方式。这种方式不区分类型转换的风险,并且有些bug是类型转换引起的,如果显示的来进行强制类型转换,可以方便bug排查。比如基类和派生类的转换风险很大,用B*(A)就非常不合适,但原创 2015-10-23 09:50:14 · 657 阅读 · 0 评论 -
c++ 程序输入参数
#include#include//argc:命令行参数的个数,执行程序程序本身的文件名,也算是一个命令行参数,argc>=1//argv:指针数组,其中每个元素都是一个char* 类型的指针,该指针指向一个字符串,每个字符串里就存放着命令行参数//argv[0]:指向的字符串就是第一个命令行参数,即可执行程序的文件名,argv[1]指向第二个命令行参数,argv[2]指向第三个命令行参数原创 2015-10-28 21:45:45 · 2764 阅读 · 0 评论 -
迭代器失效的几种情况总结
1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。for (iter = cont.begin(原创 2015-11-16 22:11:42 · 39710 阅读 · 20 评论 -
vector中存放自定义类 ,对类的要求
vector中存放自定义类的前提是:自定义的类必须有默认构造函数。因为vector会调用默认构造函数来初始化元素的对象。那必须要明确:编译器什么时候隐式声明默认构造函数?有两个条件:· 该类没有显式声明任何构造函数。--既然你都定义了,系统就不给你生成了。· 数据成员中没有const和reference。--因为要初始化。满足则隐式生成默认构造函数。这里强调“任何”,是指即原创 2015-11-16 22:04:02 · 26346 阅读 · 4 评论 -
static的含义
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用原创 2016-04-05 11:46:07 · 871 阅读 · 0 评论 -
C++ 变量相除(/)注意事项 double 型比float型要快一点
double a=1/5;coutdouble a1=1.0/5;cout原创 2015-03-12 18:51:36 · 6936 阅读 · 0 评论 -
重载输入输出操作符
//重载输出操作符ostream& operatorostream &os,const Student &sd){ os<<sd.schoolNumber<<"\t"<<sd.name<<"\t"<<sd.address<<"\t"; return os;} 形参中因为ostream不支持复制,所以必须使用引用;因为输出会改变流的状态,所以不能设为const;输出操作一般原创 2015-01-03 19:01:32 · 641 阅读 · 0 评论 -
友元函数与友元类
被指定为某类的友元的函数称为该类的友元函数。被指定为某类的友元的称为授予友元关系的那个类的友元类。在需要允许某些特定的非成员函数访问一个类的私有成员(及受保护成员),而同时仍阻止一般的访问的情况下,友元是有用的。使用友元的优点:可以灵活地实现需要访问若干类的私有或受保护成员才能完成的任务,通过使用友元函数重载,可以更自然地使用C++语言的I/O库。输入输出操作符的重载需要用友元原创 2015-01-03 19:38:51 · 560 阅读 · 0 评论 -
简单实现智能指针
#ifndef _SMART_PTR_H#define _SMART_PTR_Htemplateclass CSmartPtr{private: T* m_pT;public: //构造函数 explicit CSmartPtr(T* p=NULL); //~析构函数 ~CSmartPtr(); T& operator*()const t原创 2014-11-22 13:30:06 · 462 阅读 · 0 评论 -
字符串的处理 gets 与sscanf
char s[20]; int period,num; Node Item; while(gets(s)) { if('#'==s[0]) break; sscanf(s,"%d%d",&num,&period); Item.Q_num=num; Item.Time=period; q.push(Item); }说明:ge原创 2014-11-24 09:06:46 · 765 阅读 · 0 评论 -
初始化类中的const 类型 和 引用类型
正确的初始化是通过构造函数的初始化列表来进行,如: class Test { public: const int MY_MASK; Test() : MY_MASK(0xff) {} }; 如果不是在初始化列表中对 const 常量进行初始化,而是在构造函数中对其赋值的话,是不能成功的。很简单的道理:不能给 const 成员赋值。同样的道理,如原创 2014-12-17 10:00:28 · 696 阅读 · 0 评论 -
引用传回左值,左值可赋值,右值不可赋值
函数返回值分为:值,引用,指针三种。引用是c没有而c++有的,并且因为引用是左值实现了运算符连续运算的基础,而值和引用都不可以。下面我们就来看一下这三种返回方式的各自的特点:1、返回值[cpp] view plaincopyint test1() { int a = 1; retur a;转载 2014-12-03 12:47:10 · 910 阅读 · 0 评论 -
常成员函数只能调用常成员函数 常对象智能调用常成员函数
class A{public: void print()const{ coutvoid test() { print();}void test1() const {print();} };int main(int argc, char* argv[]){ A a;a.print();a.test();a.test1(); return原创 2014-12-04 08:54:50 · 5318 阅读 · 0 评论 -
类一定要定义拷贝构造函数,特别是在类成员含有指针的情况(不论指针是何种类型),安全!!!
举例说明一个未定义拷贝构造函数,产生的非常诡异的现象using namespace std;class people {private:char *name;int age;public:people(char *namestr,int i);/*people( const people& temp);*/~people();char *getname(原创 2014-12-04 10:20:17 · 2791 阅读 · 0 评论 -
拷贝构造函数,构造函数
当基类中“显示定义了拷贝构造函数和赋值操作符时”当派生类中“显示定义了拷贝构造函数和赋值操作符时”如果派生类中的拷贝和赋值构造函数中没有“显示指定基类的拷贝和赋值构造函数”,即:派生类只是把自己的成员进行了赋值这时需要手动调用基类的拷贝构造函数和赋值构造函数才行,基类的构造函数会自动调用的#include using namespace std;class A{原创 2014-12-11 11:05:05 · 526 阅读 · 0 评论 -
解析局部对象与临时对象
没有名字的对象就是临时对象,它存在于完整的表达式的生存其间。也就是说,当表达式计算结束后就会被释放。一个例外是,当临时对象被引用时,它的生存期将延长到与这个引用的生存期一样长。局部对象就是可见区域在一个函数范围的对象。局部对象有两种,静态局部对象的生存期起于所在函数第一次被调用,结束于main()函数退出之后。自动局部对象生存期起于所在函数每一次被调用,结束于函数返回。A fun(原创 2014-12-27 18:47:32 · 977 阅读 · 0 评论 -
strlen的使用注意事项
strlen的功能:strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')说明:strlen的统计功能,必须是遇到字符串中以'\0'为结束符的。不然统计结果出错. int main(){ char *Number = new char原创 2017-04-16 10:03:22 · 7017 阅读 · 0 评论