求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

  1. 求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型。

案例如下:

#include
<iostream>

#include
<stdlib.h>

void
main()

{

double
db = 10.9;

double *pdb
= &db;

auto
num =
pdb;

//通过typeid的方式获得数据类型

std::cout
<< typeid(db).name()
<< std::endl;

std::cout
<< typeid(num).name()
<< std::endl;

std::cout
<< typeid(pdb).name()
<< std::endl;

//typeid(db).name() db2

//decltype用于查询表达式的数据类型(Declared Type)

decltype(db)
numA(10.8);

std::cout
<< sizeof(numA)
<< " " <<
numA <<
std::endl;

system("pause");

}

运行结果如下:

2.bool类型

#include
<iostream>

#include
<stdlib.h>

void
main()

{

bool
b1 = (1 && 1) || 2 || (-1 && 0);

std::cout
<< typeid(b1).name()
<< std::endl;

std::cout
<< b1 <<
std::endl;

decltype(b1)
bt(1 + 2 * 3 - 4 && 3 + 2 || -1);

std::cout
<< typeid(bt).name()
<< std::endl;

std::cout
<< bt <<
std::endl;

system("pause");

}

截图:

3.C++中不同的细节

#include
<stdio.h>

#include
<iostream>

//C++全局变量没有声明与定义的差别

//静态全局变量也没有声明与定义的差别

//C++是强类型系统,函数返回值必须要有类型

int
a;

//inta; 
不能重复定义a

static
int
b;

//staticint b; 
不能重复定义b

//C++编译器 编译的宽泛

//为了修改源代码,后面留下拓展

//占位,占位参数

void
test(int
a,
double,
int)

{

std::cout
<< a;

}

void
main()

{

int
a = 3;

//C++检测到右值在存有实体,自动转换为左值

//C语言不会把右值转换为左值

(a = 3) = 4;

int
b = 5;

(a >
b ?
a :
b) = 2;

(++a)++;

//register C++编译器做了优化,检测到取地址,就不会把它放到寄存器

//register
可以取地址

register
int
num(1);

std::cout
<< &num <<
std::endl;

std::cout
<< a <<
b <<
std::endl;

test(1, 2.9, 3);

system("pause");

}

4.new
和delete

A:用了delete之后,最好使用使用p
=NULL;

#include
<stdio.h>

#include
<stdlib.h>

void
main()

{

int *p
= new
int;

delete
p;
//防止重复删除

p =
NULL;

delete
p;

system("pause");

}

delete只能delete一次,案例如下:

#include
<stdio.h>

#include
<stdlib.h>

#include
<iostream>

void
main()

{

int
num = 10;//栈上

int *p
= new
int;//堆上

*p = 5;

std::cout
<< *p <<
" " <<
p <<
std::endl;

delete
p;

delete
p;//只能释放一次

std::cout
<< p <<
std::endl;

system("pause");

}

错误截图如下:

修改后的状态

delete删除数组元素的时候,要加上[],案例如下:

#include
<stdio.h>

#include
<stdlib.h>

#include
<iostream>

void
main()

{

//int num[110]

int *p
= new
int[10];

std::cout
<< p <<
std::endl;

//下面定义int i = 0的循环方式C99标准支持

for (int
i = 0;
i < 10;i++)

{

p[i]
= i;

std::cout
<< p[i]
<< std::endl;

}

delete[]p;
//删除数组的空间

std::cout
<< p <<
std::endl;

system("pause");

}

截图如下:

删除对象数组的案例如下:

#include<iostream>

#include
<stdlib.h>

class
tansheng

{

int *p;

int
length;

public:

tansheng()//构建的时候初始化

{

std::cout
<< "谭胜被创建"
<< std::endl;

}

~tansheng()//删除的时候释放内存

{

std::cout
<< "谭胜被销毁"
<< std::endl;

}

};

void
main()

{

tansheng *p
= new
tansheng;

delete
p;//基本数据类型,delete,复杂类型必须加上[]

system("pause");

}

截图如下:

#include
<iostream>

#include
<stdlib.h>

class
tansheng

{

public:

static
int
jishuqi;//静态

int *p;

int
length;

public:

tansheng()
//构建的时候初始化

{

std::cout
<< "谭胜被创建"
<< std::endl;

}

~tansheng()
//删除的时候放内存

{

std::cout
<< "谭胜被销毁"
<< std::endl;

}

static
void * operator new(size_t
size)

{

jishuqi += 1;

std::cout
<< "对象被创建"
<< std::endl;

tansheng *ptemp
= ::new
tansheng;//劫持

return
ptemp;

}

static
void operator delete(void
*p)

{

jishuqi -= 1;

std::cout
<< "对象被销毁"
<< std::endl;

::delete
p;//
::全局

}

};

int
tansheng::jishuqi
= 0;

//类的内部的new没有完成分配内存的动作

//通往全局的new中间做了一个劫持

//空类占一个字节,表示自己存在

//类的对象,数据是独立,代码是共享的

//没有分配内存,构造函数无意义

class
MyClass

{

int
num;

public:

MyClass();

~MyClass();

private:

};

MyClass::~MyClass()

{

}

void
main()

{

tansheng *p1
= new
tansheng;

tansheng *p2
= new
tansheng;

tansheng *p3
= new
tansheng;

tansheng *p4
= new
tansheng;

std::cout
<< p1 <<
p2 <<
std::endl;

delete
p1;

delete
p2;

std::cout
<< tansheng::jishuqi
<< std::endl;

std::cout
<< "myclass size" <<
sizeof(MyClass)
<< std::endl;

int *p
= new
int;

system("pause");

}

结果如下:

5.枚举类型

#include
<iostream>

enum
color :char{
red =
‘A‘,
yellow,
green,
white };

void
main()

{

color
mycolor =
red;

//mycolor = ‘A‘; //确保在枚举的范围的之内不出错

mycolor =
color::white;//新语法

color
mycolor1(red);

color
mycolor2(color::red);

printf("%d,%c\n",
red,
red);

printf("%d,%c\n",
yellow,
yellow);

system("pause");

}

6.两个大数的字符串求乘

#define
_CRT_SECURE_NO_WARNINGS

#include
<iostream>

#include
<stdlib.h>

#include
<string.h>

//除了数据还有函数

struct
bigdatacom

{

protected://内部私有

char
dataa[100];

char
datab[100];

public://共有公开

void
init(const
char *str1,
const
char *str2)

{

std::cout
<< typeid(*this).name()
<< std::endl;

strcpy(this->dataa,
str1);

strcpy(this->datab,
str2);

}

char *getbigdata()

{

int
lengtha =
strlen(dataa);

int
lengthb =
strlen(datab);

//两个数相乘,乘得到的位数不可能大于两个数的位数之和

int *pres
= (int *)malloc(sizeof(int)*(lengtha
+ lengthb));

//初始化

memset(pres,
0, sizeof(int)*(lengtha
+ lengthb));

//累乘

for (int
i = 0;
i <
lengtha;
i++)

{

for (int
j = 0;
j <
lengthb;
j++)

{

//其中字符1-->9减去‘0’得到的恰巧是整型值

pres[i
+ j] += (dataa[i]
- ‘0‘)*(datab[j]
- ‘0‘);

}

}

//进位

for (int
i =
lengtha +
lengthb - 1;
i >= 0;
i--)

{

if (pres[i]
>= 10)//进位

{

pres[i
- 1] += pres[i]
/ 10;//进位

pres[i]
%= 10;//取出个位数

}

}

int
i = 0;

while (pres[i]
== 0)

{

i++;//恰好不为0的位置

}

char *lastres
= (char*)malloc(sizeof(char)*(lengtha
+ lengthb));

int
j;

for (j
= 0; j <
lengtha +
lengthb;
j++,
i++)

{

lastres[j]
= pres[i]
+ ‘0‘;

}

lastres[j]
= ‘\0‘;

return
lastres;

}

};

struct
myclass :public
bigdatacom  
//继承

{

void
coutstr() 
//新增

{

std::cout
<< this->dataa
<< this->datab
<< std::endl;

}

};

void
main()

{

myclass 
class1;

class1.init("12345",
"1000");

std::cout
<< class1.getbigdata()
<< std::endl;

class1.coutstr();

system("pause");

}

void
main1()

{

bigdatacom
big1;//C++结构体可要可不要struct

big1.init("123123",
"456456");

std::cout
<< big1.getbigdata()
<< std::endl;

system("pause");

}

7.inline只是对于编译器的建议

一般情况下,我们队内联函数做如下的限制

A:不能有递归

B:不能包含静态数据

C:不能包含循环

D:不能包含switch和goto语句

E:不能包含数组

若一个内联函数定义不满足以上限制,则编译系统把它当做普通函数对待。

案例说明:

#include
<stdlib.h>

#include<iostream>

//替换

#define
GETX3(N)
N*N*N

//1+2*1+2*1+2

//函数

//inline只是对于编译器的建议

////一般情况下,我们对内联函数做如下的限制:

//(1)不能有递归

//(2)不能包含静态数据

//(3)不能包含循环

//(4)不能包含switch和goto语句

//(5)不能包含数组

//若一个内联函数定义不满足以上限制,则编译系统把它当作普通函数对待。

inline
int 
getX3(int
x);//内联函数,内部展开

inline
int 
getX3(int
x)//类型安全

{

return
x*x*x;

}

template <class
T>

inline
T
getX2(T
x)//C++类型不匹配出错,不是单纯的替换

{

return
x*x;

}

void
main()

{

std::cout
<< GETX3(1 + 2) <<
std::endl;

std::cout
<< GETX3((1 + 2)) <<
std::endl;

std::cout
<< GETX3((2.0 + 2)) <<
std::endl;

system("pause");

}

运行结果:

8.函数模板和可变参数

#define
_CRT_SECURE_NO_WARNINGS

#include
<stdlib.h>

#include
<iostream>

#include
<cstdarg>

//函数模板,可变参数

//参数至少要有一个模板类型

template<typename
NT>

NT
sum(int
count,
NT
data1 ...)
//累加

{

va_list
arg_ptr;  
//参数列表的指针

va_start(arg_ptr,
count);//限定从count开始,限定多少个参数

NT
sumres(0);

for (int
i = 0;
i <
count;i++)

{

sumres +=
va_arg(arg_ptr,
NT);

}

va_end(arg_ptr); 
//结束

return
sumres;

}

//T通用数据类型

template<typename
T>

T
MAX(T*p,
const
int
n)

{

T
maxdata(p[0]);

for (int
i = 1;
i <
n;i++)

{

if (maxdata
< p[i])

{

maxdata =
p[i];

}

}

return
maxdata;

}

int
getmax(int
*p,
int
n)

{

int
max(0);

max =
p[0]; 
//假设第一个数位最大

for (int
i = 1;
i < 10;i++)

{

//确保max>= p[i]

if (max
< p[i])

{

max =
p[i];

}

}

return
max;

}

double
getmax(double
*p,
int
n)

{

double
max(0);

max =
p[0];//假定第一个数位最大

for (int
i = 1;
i < 10;
i++)

{

if (max
< p[i])//确保max>=p[i]

{

max =
p[i];//

}

}

return
max;

}

void
main()

{

std::cout
<< sum(5, 1, 2, 3, 4, 5) <<
std::endl;

std::cout
<< sum(6, 1, 2, 3, 4, 5, 6) <<
std::endl;

std::cout
<< sum(7, 1, 2, 3, 4, 5, 6, 7) <<
std::endl;

std::cout
<< sum(7, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1) <<
std::endl;

std::cout
<< sum(6, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1) <<
std::endl;

std::cout
<< "-----------------" <<
std::endl;

double
a[10] = { 2, 3, 4, 98, 77, 999.1, 87, 123, 0, 12 };

int 
b[10] = { 1, 2, 3, 4,15, 6, 7, 8, 9, 10 };

std::cout
<< MAX(a,
10) << std::endl;

std::cout
<< MAX(b,
10) << std::endl;

system("pause");

}

9.auto与函数模板

A:函数参数不允许使用自动变量

B:auto结合模板函数的案例如下:

#include
<stdlib.h>

#include
<iostream>

//自动数据类型,根据实际推导出类型

template <
class
T1,class
T2> 
//根据类型获取类型

auto
get(T1
data,
T2
bigdata)->decltype(data
*bigdata)

{

return
data *
bigdata;

}

void
main()

{

std::cout
<< typeid(get(12.0,
‘A‘)).name()
<< std::endl;

std::cout
<< get(12.0,
‘A‘) <<
std::endl;

std::cout
<< typeid(get(12,
‘A‘)).name()
<< std::endl;

std::cout
<< get(12,
‘A‘) <<
std::endl;

system("pause");

}

运行结果如下:

10.宽字符

#include
<iostream>

#include
<stdlib.h>

#include
<locale>

void
main()

{

setlocale(LC_ALL,
"chs");//设置本地化

wchar_t *p1
= L"123456123123qweqeqe";

std::wcout
<< p1 <<
std::endl;

wchar_t *p2
= L"北京123456";

std::wcout
<< p2 <<
std::endl;

system("pause");

}

求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

时间: 2024-10-14 22:15:21

求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符的相关文章

【C/C++学院】0814-引用高级、引用高级增加/auto自动变量自动根据类型创建数据/Bool/Enum/newdelete全局/大数据乘法与结构体/函数模板与auto/宽字符本地化/inline

引用高级.引用高级增加 #include<iostream> #include<stdlib.h> // int a[10] // int (&ra)[10] // int a[2][5] // int (&ra)[2][5] void main1() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int(&ra)[10](a);//引用就是给原来的变量有一个别名同一个地址 int i = 0; for (

?Swift语言中为外部参数设置默认值,可变参数,常量参数,变量参数,输入输出参数

引用自这里:Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 目录[-] 7.4.4  为外部参数设置默认值 7.4.5  可变参数 7.4.6  常量参数和变量参数 7.4.7  输入-输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0. [示例7-11]以下的代码就为外部参数toString.withJoiner设置了默认的参数"Swift"和&qu

?Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0. [示例7-11]以下的代码就为外部参数toString.withJoiner设置了默认的参数"Swift"和"---".代码如下: import Foundation func join(string s1: String, toString

【C语言】求多个数中的最大值(可变参数列表)

求多个数中的最大值要求用可变参数列表: 代码如下: <span style="font-size:18px;">#include<stdio.h> #include<stdarg.h> int Max(int n,...) { int i=0; int max=0; va_list arg; va_start(arg,n); for(i=0;i<n;i++) { int val=va_arg(arg,int); if (val>max)

C#面向过程之局部变量、成员变量、变量作用域、可变参数

局部变量与成员变量:  局部变量:定义在方法里面的变量就叫做局部变量:没有默认的初始值,使用变量之前必须给它赋值成员变量:定义在类下面的变量叫做成员变量:如果是数值类型默认初始值为0 如果是引用类型默认初始值为空 变量作用域: 范围 变量在那些范围可以访问到 在对应的大括号里面能访问 Console.WriteLine() Console.Out.WriteLine() 可变参数: params int [] arr arr为一个可变数组 可以给多个元素 也可以只给一个 也可以不给,若一个参数都

C++基础知识(二)—— 变量和数据类型

你可能觉得这个"Hellow World"程序用处不大.我们写了好几行代码,编译,然后执行生成的程序只是为了在屏幕上看到一句话.的确,我们直接在屏幕上打出这句话会更快.但是编程并不仅限于在屏幕上打出文字这么简单的工作.为了能够进一步写出可以执行更有用的任务的程序,我们需要引入变量(variable)这个的概念. 让我们设想这样一个例子,我要求你在脑子里记住5这个数字,然后再记住2这个数字.你已经存储了两个数值在你的记忆里.现在我要求你在我说的第一个数值上加1,你应该保留6 (即5+1)

03-基本数据类型(int,bool,str)

本节主要内容 1.python 基本数据类型回顾 2.int ----数字类型 3.bool ---布尔类型 4.str ---字符串类型 一.python 基本数据类型 1.int ==>整数,主要用来进行数学运算 2.str ==>字符串,可以保存少量数据并进行相应的操作 3.bool ==>判断真假,True,False 4.list ==>存储大量数据.用[ ]表示 5.tuple ==>元组,不可以发生改变,用()表示 6.dict ==>字典,保存键值对,一

C语言核心技术-变量和数据类型

C语言核心技术-变量和数据类型 C语言核心技术 2.1 计算机的计算单位 2.1.1 容量单位 2.1.2 速度单位 2.2 数据类型 2.2.1 数据为什么要分类 2.2.2 C语言常用基本数据类型 2.2.3 sizof关键字查看数据类型占据的内存容量 2.2.4 数据的有符号和无符号 2.2.5 数据类型的极限 2.3 常量 2.4 变量 2.4.1 变量的本质 2.4.2 变量的定义 2.4.3 变量的初始化 2.4.4 变量的声明 2.4.5 变量的使用 2.5 读取键盘的输入 2.6

01、Java基础语法(常量、进制转换、原/反/补码、变量和数据类型)

1.常量 2.进制转换 3.原码.反码和补码 4.变量和数据类型 1.常量 常量:在程序执行过程中其值不发生改变. Java中常量的分类: 字面值常量: 自定义常量:(面向对象讲解,static final) 字面值常量的分类: 字符串常量:(用双引号引起来的内容, "HelloWorld") 整数常量:(所有整数,12,23) 字符常量:(用单引号引起来的内容,'A','1','中') 小数常量:(所有小数,3.14) 布尔常量:(只有true和false) 空常量null:(数组部