day01AM_C++基础_C++风格字符串_名称空间_引用
1.文件 fopen ,fseek, fclose,
fscanf/fprintf, fgets/pfuts ,fgetc/fputc(函数), getc/putc(可能是宏),
angetc,stdin,stdout,stderr,
fread/fwrite,
"b":二进制文件打开
feof
fseek/ftell,
man -s2 stat //unix,读取文件大小
stat --help
fflush
C++开始
1.封装:我的数据是安全的,别人不让访问,仅仅允许自己的函数访问,
2.继承
3.多态
4.模板,通用类型
5.异常处理
6.编译 g++/c++
7.文件后缀 .cpp, .c, .cc, .cxx, .h, .hpp
8.g++ -c xxx.cpp -> xxx.o
g++ xxx.o -> a.out ; g++ xxx.o -o newname
9.g++ xxx.cpp -> a.out ; g++ xxx.cpp -o newname
10.namespace std //标准库的东西都放到名字空间 std
using namespace std;//使用 std的名字空间
11.C89版本时,需要先把变量定义完,在写执行的语句
12.endl //end line == '\n'
13.kuai shuijoao
14.using std::cout;//A::B ,A范围内的B
using std::endl;
using std::string;
using std::cout;
15.cpp xxx.cpp //预处理后的结果
16.定义名字空间
namespace cdq{string name="abc";}
namespace furong{char name[20]="cdeg";}
using namespace furong;
int main()
{
cout<<name<<endl; //cdeg
}
17. ::name //全局的
18.string s1; // C++风格
s1.size();
s1.find();
s1[i];
char s2[100]; //C风格
strcpy();
strcmp();
strlen();
strchr();
strstr();
C -> C++ //字符串自动转
C++ -> C //s1.c_str() -> s2 //返回const char*
19. enum Color{BLACK,RED};
20.C++调用函数时,不做类型提升, C会做类型提升。 ...按照C的规则提升
day01PM_常量_指针_new_delete_函数
1. 引用 reference
2. const double &dRef = 124.4; //对常量引用,常引用
3. static_cast 数值类型之间的转换
const_cast 用于临时去掉 cast, volatile
reinterpret_cast 任意两中指针类型之间转换,指针 于数值类型转换
dynamic_cast
4.成员指针,成员地址
//结构体变量 *
struct date
{
int day;
int month;
void print();
}
ShowMenber(date a[], int nNum, int date::*mp)
{
for(int i=0; i<nNum; i++)
{
cout<<(a+i)->*mp<<endl;
}
}
int main()
{
union{
int n;
int date::*mp; //成员指针
}
mp = &date::day;
cout<<"n="<< n <<endl; // 读取的date::day的变量值
date d={1,12};
cout<<d.*mp<<endl;//
mp = &date::moth;
d.*mp //..
date a[2]={{1,2},{2,3}};
ShowMember(a, 2, &date::month);
void (date::*pf)()=&date::print;
(d.*pf)();
(a->*pf)();
}
day02AM_引用_函数重载_形参默认值
1.引用,函数指针
void JiaoHuan(int &a, int &b)
{}
int main()
{
void(*p)(int&, int&)=&JiaoHuan;
}
2.C++ 输出16进制,引用
void(const int& nValue)
{
cout<<hex<<showbase<<nValue<<endl;
}
3.引用作为返回值
int& Max(int &a, int &b)
{
return a>b?a:b;
}
int& Count()
{
static int cnt =0;
++cnt;
return cnt;
}
int main()
{
Count()=1000;
cout<<Count()<<endl;
cout<<Count()<<endl;
cout<<Count()<<endl;
}
4.inline 内联函数
inline int Fun1(int nValue)
{
return nValue*nValue;
}
int main()
{
cout<<Fun1(10)<<endl;
}
5.liux下 C++头文件
ls /usr/include/c++/4.1.1
6.字符串类 string
replace, insert
7.setw(), setfill('0')
8.定义类对象是加(),编译器会认为是函数声明。
class Persion;
Persion e(): // 函数声明
9.每个成员函数里面都有个隐藏指针this
this // 当前对象的指针
编译器把对象
Persion a
(*this).name = name;
this->name = name;
10.运算符重载
......
public:
friend ostream& operator<<(ostream& out, Array& arValue)
{
out<<"字符串为"<<arValue.GetValue()<<"\n Len:"<<arValue.GetLen()<<endl;
return out
}
friend istream=""& operator>>(istream& in, Array& arValue)
{
in>>arValue.nT1>>arValue.nT2;
return in;
}
int main()
{
cin>>aObj;
cout<<aObj<<endl;
}
11.构造函数,拷贝构造函数,都是在初始化的时候调用,赋值不调用。
12.
day05PM_多重继承_虚继承_多态_typeinfo
1.定义对象,首先调用父类的构造函数,在执行自己构造函数。多个父类,按照继承顺序
执行构造函数。
每个析构函数,总会先调用自身,在析构父类。
2.按照继承顺序调用,不会按照初始化列表顺序调用。
3.virtual继承:来之基类的对象保留一份,用最子类,初始化最基类。
4.多重继承,如果重复用::
5.virtual :虚函数,按照对象类型来调用方法,而不是按照指针类型来调用方法。
6.多态,通过指针(引用)调用虚函数的时候。才会用到多态。
8.父类指针 可以指向父类,及子类对象。
子类指针 只能指向子类对象。
dynamic_cast, 检查一个对象是否是子类对象。
dynamic_cast<子类*>(父类对象地址),是的话返回正常地址,不是返回NULL
如 cout<<dynamic_cast<Teacher*>(pPersion)<<endl;
9.typeinfo:运行时类型识别。一个结构体
10. explicit: 禁止自动类型转换
11.typeid(A).name(), typeid(A)返回一个typeinfo的对象
12.写一个数据库类Database,提供connect,query 两个虚函数
程序类Program,提供一个公开的成员函数,void visit(Database* p){p->connect(); p->query();}
再写三个数据库子类,Oracle,Access,SQLServer. 覆盖connect,query 两个虚函数
在main函数用一个Program对象访问这三种数据库。
13.写一个艺术品类,提供一个print()显示艺术品的信息。写2个子类Painting,Music
其中Painting信息有作者,年代,尺寸,Music 再分2个子类,流行音乐,和摇滚音乐。前者的信息包含作者,年代,时间长短,演唱者,
后者的信息包括作者,年代,时间长短,和演奏人数,写一个全局函数
void show(Arts &a)
{
a.print():
}
在main函数用每种艺术品子类创建一个对象,调用show
函数分别显示他们的信息。
14.基类,USB,子类 USBFan,USBprint, 接口类Computer ,方法Use(USB *usb),