//43C++Primer_特殊工具与技术txwtech做特殊软件会用上
/*
allocator类--是一个类模板,内存分配,指定大小的内存,没有构造对象。
RTTI--运行时对象类型识别。用在不能使用虚函数时
类成员的指针
嵌套类
union--联合
局部类--一个类在函数里面,也只能函数的局部使用
位域
volatile---易失的,挥发性的(volatile int y;//告诉c++,不要对y进行优化,不要改变在内存中的位置)
extern "c",c与C++混在一起,c++调用c语言的函数,就需要extern "c"
如下:
extern "c" void show(char *);
*/
//extern "C" void show(char *);
//extern "c",c与C++混在一起,c++调用c语言的函数,就需要extern "c"
extern "C" void show(const char *);//添加一个const就可以了
//严重性 代码 说明 项目 文件 行 禁止显示状态
//错误(活动) E0167 "const char *" 类型的实参与 "char *" 类型的形参不兼容 cc43a_demo C : \Users\TT2018\Documents\Visual Studio 2017\Projects\cc43a_demo\cc43a_demo\cc43a_demo.cpp 78
//43C++Primer_特殊工具与技术txwtech做特殊软件会用上
/*
allocator类--是一个类模板,内存分配,指定大小的内存,没有构造对象。
RTTI--运行时对象类型识别。用在不能使用虚函数时
类成员的指针
嵌套类
union--联合
局部类--一个类在函数里面,也只能函数的局部使用
位域
volatile---易失的,挥发性的(volatile int y;//告诉c++,不要对y进行优化,不要改变在内存中的位置)
extern "c",c与C++混在一起,c++调用c语言的函数,就需要extern "c"
如下:
extern "c" void show(char *);
*/
#include <iostream>
using namespace std;
class Item_base
{
public:
virtual double net_price(size_t n) const//虚函数
{
class Cat //局部类
{
};
Cat cat;//局部类,也只能这里局部使用
return n * price;
}
//嵌套类
class Dog
{
};
public:
std::string isbn;
protected:
double price;
};
//派生类
class Bulk_item :public Item_base
{
public:
double net_price(std::size_t cnt) const
{
if (cnt > min_qty)
return cnt * (1 - discount)*price;
else
return cnt * price;
}
private:
std::size_t min_qty;
double discount;
};
union TokenValue //就是一个类
{
//三个数据是重叠打包在一起的,以数据里面最大的字节作用存储.三个实际是同一个
char cval;
int ival;
double dval; //dobule 8个字节,第一个给cval,4个字节给ival
};
//位域,用无符号整形来做
typedef unsigned int Bit; //
class File //位域类
{
public:
Bit mode : 2;//占2位
Bit modified : 1; //占1位
Bit prot_owner : 3;
Bit prot_group : 3;
Bit prot_world : 3;
//。。还可以写,共32位
};
enum { READ = 01,WRITE=02 };
//extern "C" void show(char *);
//extern "c",c与C++混在一起,c++调用c语言的函数,就需要extern "c"
extern "C" void show(const char *);//添加一个const就可以了
//严重性 代码 说明 项目 文件 行 禁止显示状态
//错误(活动) E0167 "const char *" 类型的实参与 "char *" 类型的形参不兼容 cc43a_demo C : \Users\TT2018\Documents\Visual Studio 2017\Projects\cc43a_demo\cc43a_demo\cc43a_demo.cpp 78
int main()
{
show("hello extern \"C\"\n");
File myFile;
myFile.mode = WRITE;//位域使用方法
myFile.modified = 1; //表示文件被修改了
TokenValue myToken = { 'a' };//第一个给cval,a就是 97。
cout << myToken.ival << endl;//ival读取的结果就是977
int x;
volatile int y;//告诉c++,不要对y进行优化,不要改变在内存中的位置
//getchar();
//创建对象用new操作符,创建对象,分配内存。
Item_base *pItem = new Item_base();
allocator<Item_base> a;//指定分配100的内存空间分配
a.allocate(100);//指定分配100的内存空间分配
Item_base *bp = new Item_base();
Bulk_item *dp = new Bulk_item();
Item_base *bp2 = dp;//派生类对象,转基类对象
Bulk_item *dp2 = dynamic_cast<Bulk_item*>(bp);//基类转派生类。//动态类型转换,就用到了RTTI(运行时对象类型识别)
if (typeid(Bulk_item) == typeid(*dp))
cout << "Bulk_item的类型" << endl;
//typeid,检查对象的类型,返回的是typeinfo ,name()
cout << typeid(*bp).name() << endl;//用到了RTTI(运行时对象类型识别)
cout << typeid(*dp).name() << endl;//用到了RTTI(运行时对象类型识别)
std::string Item_base::*p=&Item_base::isbn; //指针指向Item_base类的字符串成员
double(Item_base::*pmf)(std::size_t) const=&Item_base::net_price;//指向函数指针
Item_base::Dog dog;//使用嵌套类
system("pause");
return 0;
}
demo.c
#include <stdio.h>
//c语言的
void show(char *msg)
{
printf("%s\n",msg);
}