现在偶尔学学c++,隔一段时间就忘了c++的一些基本概念或者操作方法,现在把自己的东西记录一哈
较老的版本
#include<iostream.h>
std::cout<<""<<std::endl;
和
#include<iostream>
using namespace::std;//告诉编译程序使用std名称空间,这是标准c++库声明使用的名称空间
cout<<""<<endl;
两种形式
标准c++头文件不再使用.h
常见头文件:
stdio :standard buffered input&output
带缓冲的输入和输出
iostream : input output stream
标准输入输出流-----cin cout
ctype
字符处理函数 ----getc pintf gets fwriter。。
本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换
math
函数处理函数
stdlib
字符串转换 存储器 退出程序等------atol。 malloc exit
string
对字符串进行合并比较--strcpy memecpy strcmp
time
对时间和日期的处理--clock time mktime
出自:http://blog.csdn.net/nkcszwb/article/details/5396269
今天面试android,却做了一套c的题,真的是各种不上手啊。现在把c遇到的问题都记一下,以免隔断时间又忘光了。
c构造函数和析构函数的调用顺序:
#include <stdio.h>
#ifndef AAA
#define AAA
class A {
public:
A()
{
printf("构造方法A\n");
}
void fun()
{
printf("fun A\n");
}
virtual ~A()
{
printf("析构方法A\n");
}
};
#endif;
#include "A.cpp"
#include<iostream>
using namespace::std;
class B : public A
{
public:
B(void)
{
printf("构造方法B\n");
}
void fun()
{
cout<<"fun B\n"<<endl;
}
virtual ~B(void)
{
printf("析构方法B\n");
}
};
int main(int argc,char *argv[]){
//A a;
//B b;
//A* p1=&a;
//A* p2=&b;
A* p1 = new A();
A* p2 = new B();
p1->fun();
p2->fun();
printf("a:%d\n",p1);
printf("b:%d\n",p2);
delete p2;
delete p1;
system("pause");
}
结果:
构造方法A
构造方法A
构造方法B
fun A
fun A
a:4082760
b:4075776
析构方法B
析构方法A
析构方法A
1,子类继承父类,构造方法先父类后子类;析构函数先子类后父类。
总结两者的顺序:先构造的后析构,也就是说构造的顺序和析构的顺序相反
2,delete对象完成两个动作,析构和释放空间,当执行delete时,先调用析构函数, 然后调用operate delete删除指针(据说说话应该是把指针指空,而不是删除指针)。
对象只在生命周期结束时自动调用析构函数释放对象资源。delete这个动作标志生命周期结束,就必然引起析构
3,如果把main.cpp的注释内容反注释,把new A() new B()注释,这时的delete会在运行的时候报This may be due to a corruption of the heap错误,
这是因为这样声明A a和B b, 它的生命周期到该方法结束。我delete 释放了资源,然后在方法结束的时候系统又回自动回收对象A ,B,就会导致上面这个错误。
4,new出来的对象是在堆上,需要手动释放,其他系统会自动释放。