1.不可以作为C++用户标识符的是()
C++大小写敏感; case是关键字
2.下列符号中,不可作为分隔符的是()
3.在面向对象语言中可扩充性是关键
4.C++程序的实现经过编辑、编译、运行步骤
5.C++编辑器进行编译的过程可详细的分为三个子过程,分别是预处理过程、编译过程、连接过程。
6.常量3.14的数据类型为double
3.14是double
3.14f是float
3.14L是long double
7.设有定义:char ch; ,以下赋值语句正确的是()
B错:ASCII码范围是1~127,ff是255太大了,且十六进制表示ascii码要求有三位二进制数;
C错:八进制不能出现8
8.英文大写字母B的ASCII码为42H,英文小写字母b的ASCII码为62H
H后缀表示十六进制;大小写字母的ASCII码相差32。 32的十六进制是20
9.已知:int a = 5, b = 6;, 下面表达式中,有二义性的是()
a+b>>3不同的编译器效果不同,记住!
10.表达式(-17)%5的值等于表达式(17)%(-5)的值
都是-2
11.下列说法正确的()
隐含类型转换:编译器自动完成,低类型转换为高类型,不会损失数据精度
显式类型转换:由用户指定,强制转换,可能出现数据精度损失(int)3.14
12.C++中可以用于浮点数的运算符:++
13.结合性从左到右:==
14.结果是1
#include
using namespace std;
int main()
{
int x, y, z;
x=y=z=1;
int t = ++x||++y&&++z;
cout<
逻辑运算符短路原则,++x 为1 后面的不用算了,整个(++x||++y)就为1,再和后面的算
15.结果为 666
#include
using namespace std;
int main()
{
int a, b, c;
a=b=c=5;
b+=++a&&++c>b;
cout<
相当于b+=( (++a) && (++c>b) ), 先执行等号右边的表达式,等于1,b = b+1
16.在C++中,const修饰符主要用于代替C语言中的#define
关键字进行常量定义
17.在32位计算机中,若有double * p;
,则p占用4字节的内存空间。
18.空字符串长度为1
空字符串中只有一个\0
19.辗转相除法求整数a、b最小公倍数
#include
using namespace std;
int main()
{
int a, b;
cin>>a>>b;
int i=1;
if(a
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数
最小公倍数=两数之积/最大公约数
int main()
{
int a,b,c,d,e;
cout<<"请输入两个整数:"<>a>>b;
d=a;e=b;
do{
c=a%b;
a=b;
b=c;
}while(c!=0);
cout<<"最大公约数是:";
cout<
20.下列关于函数模板叙述正确的()
C++中typename和class可以替换,引入只是为了避免混淆,作用一样
#include
using namespace std;
template
T max(T a, T b, T c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
int main()
{
int x1=1, x2=2, x3=3;
double d1=1.5, d2=2.5, d3=3.5;
int rs = max(x1, x2, x3);
double rs2 = max(d1, d2, d3);
cout<
函数模板:重点在模板,专门产生函数的模子;
模板函数:重点在函数,由模子生成而来的函数。
21.下列叙述正确的是()
A错,预处理命令行可以出现在源程序的任何位置上,通常在开头。
B错,源程序的一行上只能出现一条预处理命令。
C错,宏名只要是符合要求的标识符都可以,没有规定一定要大写。
D正确,宏替换在程序编译时,就由编译程序对出现的宏名进行了相应的宏替换,因此宏替换不占用程序的运行时间。
22.关于局部变量说法错误的
错!函数声明中的形参不起作用;函数定义中的形参才起作用!
23.属于文件及作用域的标识符是
文件作用域
在函数和类之外说明的标识符具有文件作用域,其作用域从说明点开始,在文件结束处结束。
#include
int i; //文件作用域
void main()
{
i=5;
{
int i; //块作用域
i=7;
cout << "i=" << i ;// 输出7
}
cout<< "i=" << i; //输出5
}
24.作用域运算符的功能是
25.当函数的自变量个数不确定时,参数表用()标识
int printf( const char* format, ...);
26.说法正确
记住!
27.下列关于用#define
定义说法正确的()
#undef
取消为止或文件结束#define定义预处理器标识符,将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。
28.关于寄存器变量一下说法都是正确的:(记住)
29.变量默认初始化
30.预处理命令
31.下列关于内联函数的描述中错误的是( )
是否把当前函数作为内联函数并不是关键字就能决定的, 编译器会左右
32.下列程序第几行编译出错
#include
#define aa 123; //虽然有 ; 但是编译能通过
using namespace std;
int main(void)
{
cout<
33.下列程序运行结果
#include
using namespace std;
int a;
int main()
{
int a(20); //局部变量1
{
int a; //局部变量2
a=10;
::a=5; //将全局变量a赋值5
cout<
运行结果:
10
20
5
34.数组说法不正确
数组是有序数据的集合
35.程序结果
#include
using namespace std;
int a[10];
int c; //全局变量默认是0
int main()
{
int i = 0, j;
int x;
while(i<10)
{
cin>>x;
for(j=0;j=c) a[c++]= x; //c是当前的下标
i++; //循环次数
}
for(i=0;i
75 78 76 75 81 92 60 55 70 78
92,55,60,75,76,78,81,70,
36.程序找错(A)
class CC1
{
private:
int a=2; //A
CC(); //B
public:
CC1(int val); //C
~CC1(); //D
}
数据成员不能在类体内初始化!!!
37.类的指针成员的初始化是通过函数完成的,这个函数通常是()
38.在派生类中重新定义虚函数时,必须在下列哪方面与基类保持一致()
39.在函数调用时,如某一默认参数要指明一个特定值,则有()
40.this指针存在的目的
保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码
41.以下赋值正确的语句是()
指向一维
42.释放动态数组正确的语句**(很重要!!!)**
int *p = new int[10];
43.运算结果
cout<<(3<<3)<>3)<
"<<"左移 3的二进制位0000 0011,左移三个单位0001 1000,即24
">>"右移 24的二进制位0001 1000,右移三个单位0000 0011,即3
"^"异或运算, 2的二进制为 0010,5的二进制为0101 结果为 0111,即7
44.const成员函数可以在类的外部初始化(错!)
const成员函数只能通过构造函数的参数初始化表进行初始化
char name[] = "C++";
course(name);
可以判断函数course
的调用是采用
实参是数组,传递的是第一个元素的首地址,所以是传址调用
A项错误,记住
C项错误,不能通过类名调用
D项错误,如果友元函数为一般函数,那么可以直接调用!
static
,则该成员函数()A错误,静态成员函数不可以同时声明为 virtual、const、volatile函数
C错误,静态成员函数没有this指针,只能引用静态成员
D错误,可以通过对象名引用,也可以通过类名引用,但最终归属于类
1.定义一个商品类CGoods,其中包含商品号(long no)、商品名(char *p_name)、商品价格(double price)三个数据成员,以及相应的构造函数、拷贝构造函数、析构函数、打印数据成员的成员函数
#include
#include
using namespace std;
class CGoods
{
protected:
long no; //商品号
char *p_name; //商品名
double price; //商品价格
public:
CGoods(long n, char *name, double p); //构造函数
CGoods(const CGoods &goods); //拷贝构造函数
~CGoods(); //析构函数
void print() const; //打印成员函数
};
CGoods::CGoods(long n, char *name, double p)
{
no = n;
p_name = new char[strlen(name)+1];
strcpy(p_name, name);
price = p;
}
CGoods::CGoods(const CGoods &goods)
{
no = goods.no;
p_name = new char[strlen(goods.p_name)+1];
strcpy(p_name, goods.p_name);
price = goods.price;
}
CGoods::~CGoods()
{
delete p_name;
}
void CGoods::print() const
{
cout<<"Goods no: " <
Goods no: 1001
Goods name: shirt
Goods price: 100
2为CGoods类增加一个商品总数(int count)数据成员,并增加一个成员函数getCount()获取cout的值,编写与一个友元函数getName()获取商品名称p_name。
#include
#include
using namespace std;
class CGoods
{
protected:
long no; //商品号
char *p_name; //商品名
double price; //商品价格
static int count; //商品总数
public:
CGoods(long n, char *name, double p); //构造函数
CGoods(const CGoods &goods); //拷贝构造函数
~CGoods(); //析构函数
void print() const; //打印成员函数
static int getCount(); //静态成员函数
friend char *getName(CGoods &good); //友元函数
};
int CGoods::count = 0; //初始化静态成员商品总数
CGoods::CGoods(long n, char *name, double p)
{
no = n;
p_name = new char[strlen(name)+1];
strcpy(p_name, name);
price = p;
count++;
}
CGoods::CGoods(const CGoods &goods)
{
no = goods.no;
p_name = new char[strlen(goods.p_name)+1];
strcpy(p_name, goods.p_name);
price = goods.price;
count++;
}
CGoods::~CGoods()
{
delete p_name;
count--;
}
void CGoods::print() const
{
cout<<"Goods no: " <
Goods no: 1001
Goods name: shirt
Goods price: 100
Goods no: 1001
Goods name: shirt
Goods price: 100
total count: 2
name: shirt
4.以CGoods的类为基类,派生出CClothes和食品类CFood两个派生类,并在这两个勒种分别增加一个表示品牌的指针成员(char *p_brand)和表示用途的成员函数(void usedFor()–可分别输出一条表示服饰和食品用途的信息)。写出CClothes类和CFood类的完整定义(包括构造、析构和usedFor()成员函数的实现)
#include
#include
using namespace std;
class CGoods
{
protected:
long no; //商品号
char *p_name; //商品名
double price; //商品价格
static int count; //商品总数
public:
CGoods(long n, char *name, double p); //构造函数
CGoods(const CGoods &goods); //拷贝构造函数
~CGoods(); //析构函数
void print() const; //打印成员函数
static int getCount(); //静态成员函数
friend char *getName(CGoods &good); //友元函数
};
int CGoods::count = 0; //初始化静态成员商品总数
CGoods::CGoods(long n, char *name, double p)
{
no = n;
p_name = new char[strlen(name)+1];
strcpy(p_name, name);
price = p;
count++;
}
CGoods::CGoods(const CGoods &goods)
{
no = goods.no;
p_name = new char[strlen(goods.p_name)+1];
strcpy(p_name, goods.p_name);
price = goods.price;
count++;
}
CGoods::~CGoods()
{
delete p_name;
count--;
}
void CGoods::print() const
{
cout<<"Goods no: " <usedFor();
cout<<"total count: "<
Goods no: 1001
Goods name: shirt
Goods price: 100
Goods no: 1001
Goods name: shirt
Goods price: 100
total count: 2
name: shirt
use for wearing
use for eating
total count: 4
total count: 3
- 设计简单的程序,计算表达式根号1+x方/(1+x)
#include
#include
using namespace std;
int main()
{
int x;
double z;
cout<<"please input enter the number x:"<>x;
z= sqrt( 1+pow(x, 2)/(1+x) ) ;
cout<<"The result is: "<
please input the number x:
0
The result is: 1
- 任意输入10个整数,并将其按照从大到小的顺序排序输出
//冒泡排序,小数沉底
#include
using namespace std;
int main()
{
int i, j, t, a[10];
cout<<"please input 10 numbers: "<>a[i];
for(i=0; i<9; i++)
for(j=0; j<9-i; j++)
if(a[j]
please input 10 numbers:
0 1 2 3 4 5 6 7 8 9
The result is:
9 8 7 6 5 4 3 2 1 0
//选择排序
#include
using namespace std;
int main()
{
int i, j, temp, a[10], max;
cout<<"please input 10 numbers: "<>a[i];
//选择排序
for(i=0; i<9; i++)
{
max = i;
for(j=i+1; j<10; j++)
if(a[j]>a[max])
max = j;
if(max != i)
{
temp = a[i];
a[i] = a[max];
a[max] = temp;
}
}
for(i=0; i<10; i++)
cout<
- 设计一个程序,定义4个函数分别返回两个双精度数的和、差、积、商(注意解决除数为零的情况)
#include
using namespace std;
double he(double a, double b){return a+b;}
double cha(double a, double b){return a-b;}
double ji(double a, double b){return a*b;}
double shang(double a, double b){return a/b;}
int main()
{
double d1=1, d2=1;
cout<<"please input 2 number(double): "<>d1>>d2;
while(d2 == 0)
{
cout<<"除数不能为0,请重新输入:"<>d1>>d2;
}
cout<<"和:"<
please input 2 number(double):
1 0
除数不能为0,请重新输入:
0 0
除数不能为0,请重新输入:
0 1
和:1
差:-1
积:0
商:0
4.设计一个圆形的类Circle,其私有数据成员(double类型)r为半径;公有成员函数GetL、GetS用于返回其周长及面积;Set函数用于设置r的值;构造函数在没有参数传入时把r的初始值化为0,若有参数传入则按参数数值初始化r的值;试在主函数中创建类Circle的对象,并输出r为3.5是的周长和面积
#include
using namespace std;
class Circle
{
private:
double r;
public:
Circle(double a=0){r=a;} //注意,这里用的是带默认参数的构造函数
double GetL(){return 2*3.14*r;}
double GetS(){return 3.14*r*r;}
void Set(double a){r=a;}
};
int main()
{
Circle c;
c.Set(3.5);
cout<<"周长:"<
(1)月工资计算办法:销售经理固定月薪8000,并提取销售额的 5/1000作为工资;销售员工只有提取销售额的5/1000作为工资。
(2)基类Employee,包含3个数据成员(number、name、salary),用于输入编号和姓名的构造函数。
(3)由Employee类派生SalesMan类,SalesMan包含两个新数据成员commrate、sales,还包含用于输入销售额并计算销售员工工资的成员函数pay和用于输出的成员函数print
(4)由Salesman类派生SalesManager类,包含新数据成员monthlypay,以及用于输出销售额并计算销售经理工资的成员函数pay、用于输出成员函数print()。(5)在main函数中测试,求出不同员工的工资
#include
using namespace std;
class Employee
{
protected:
long number;
string name;
double salary;
public:
Employee()
{
cout<<"编号:";
cin>>number; //在构造函数中输入
cout<<"姓名:";
cin>>name;
salary=0;
}
};
class SalesMan:public Employee
{
protected:
double commrate;
double sales;
public:
SalesMan()
{
commrate = 0.005;
}
void pay()
{
cout<>sales;
salary = sales*commrate;
}
void print()
{
cout<<"销售员:"<>sales;
salary = monthlypay+sales*commrate;
}
void print()
{
cout<<"销售经理:"<
编号:1001
姓名:Jack
Jack本月销售额:1000
销售员:Jack, 编号:1001, 本月工资:5
编号:1002
姓名:Peter
Peter本月部门销售额:1000
销售经理:Peter, 编号:1002, 本月工资:8005
(1)定义结构变量Point,直线类Line
(2)Point中有x,y两个成员,表示横纵坐标
(3)Line类有两个数据成员a、b,表示y=ax+b的系数,成员函数print用于显示直线方程;友元函数setPoint(Line &l1, Line &l2)用于求两条直线的交点
(4)在main函数中建立两个直线对象,分别调用print显示两条直线方程,并调用setPoint求着两条直线的交点
#include
using namespace std;
struct Point
{
double x; //横坐标
double y; //纵坐标
};
class Line
{
private:
double a; //斜率
double b; //截距
public:
Line(double x, double y):a(x),b(y){}
void print(){cout<<"y="<x = (l2.b-l1.b)/(l1.a-l2.a);
p->y = p->x*l1.a+l2.b;
}
return p;
}
int main()
{
Line l1(5, 1), l2(2, 1);
l1.print();
l2.print();
Point *p = setPoint(l1, l2);
if(p != NULL)
cout<<"交点为 ("<x<<", "<y<<")"<
y=5x+1
y=2x+1
交点为 (0, 1)
- 定义Time类,拥有hours、minutes和seconds作为数据成员的Time类;设计了成员函数将两个Time对象相加(即时间相加),并进行相应的检查,按60进制设计
#include
using namespace std;
class Time
{
private:
int hours;
int minutes;
int seconds;
public:
void set_time();
void add_time(Time &t1, Time &t2);
void print();
};
void Time::set_time()
{
cout<<"please input time:"<>hours>>minutes>>seconds;
}
void Time::add_time(Time &t1, Time &t2)
{
hours = t1.hours + t2.hours;
minutes = t1.minutes + t2.minutes;
seconds = t1.seconds + t2.seconds;
int i;
i = seconds/60;
seconds%=60;
minutes+=i;
i = minutes/60;
minutes%=60;
hours+=i;
}
void Time::print()
{
cout<
please input time:
1 49 50
please input time:
1 30 10
3:20:0
char *p = "Hello";
输出这个字符串的地址值()
A.cout<<*p; //输出第一个字符,也就是H
B.cout<
C.cout<<&p; //输出指针变量的地址,而非字符串地址
D.cout<<(void *)p; //输出字符串首地址, 要加(void *),否则 p会被认为是字符串。原因:运算符重载的匹配规则
在一个类中定义拷贝构造函数的目的,是为了当利用该类的一个对象初始化另一个对象时,能够避免这两个对象的同一指针同时指向同一块的动态存储空间。
template T max(T t1, T t2)
{
return t1>t2?t1:t2;
}
max(1, 2.6);
答:函数模板要求两个形参的类型一致,不允许一个是int型一个是double类型,需要将函数模板作出修改
#include
using namespace std;
template T2 max(T1 t1, T2 t2){
return t1>t2?t1:t2;
}
int main()
{
cout<(1, 2.6);
return 0;
}
#include
和#include "filename.h"
有什么区别?#include
首先从库文件所在目录搜索文件,在从项目当前路径中搜索文件;
#include "filename.h"首先从项目当前路径中搜索文件,再从库文件所在目录搜索文件
程序用随机函数生成两位数,取M个各不相等的数据,按生成顺序存放在数组a中。最后输出这个20个数,每10个数换一行
#include
#include
#include
using namespace std;
int insert(int ap[], int k, int n);
int main()
{
const int M = 20;
int n, i=0;
int a[M] = {0};
srand(time(0)); //根据每次运行的时间初始化随机数发生器
while(i
生成数组:
77 27 51 18 62 63 30 65 25 35
98 39 47 83 34 94 95 58 55 59
总结:
#include //头文件不能少
#include
srand(time(0)); //根据每次运行的时间初始化随机数发生器
rand(); //产生随机数范围0~65536
//都等价
int insert(int ap[], int k, int n);
int insert(int *ap, int k, int n);
用拼音输入的名字自动生成6位数字串的密码。
规则:
(1)取字母串的最后6位逆序
(2)每个字母小写的ASCII码值,其除以10的余数为该位的密码值。
(3)当输入名字的字母串不足6位,生成时以字母"z"补足
#include
using namespace std;
struct Link
{
char c; //字符
Link *next; //指针
};
void inputName(Link *&head);
void getCode(Link *&head, Link *name);
void outLink(Link *link);
int main()
{
Link *name=NULL, *code=NULL; //初始化姓名链表、密码链表
cout<<"请输入姓名拼音,以#结束:"<next = NULL;
cin>>p->c;
while( (p->c >= 'a' && p->c <= 'z' || p->c >= 'A' && p->c <= 'Z') && p->c !='#' ) //姓名输入没结束
{
p->next = head;
head = p;
p = new Link;
cin>>p->c;
}
}
void getCode(Link *&head, Link *name) //正序存储
{
head = new Link;
head->next = NULL;
Link *p = head;
char c = name->c;
for(int i=0; i<6; i++)
{
p->c = (tolower(c))%10+'0';
p->next = new Link;
p = p->next; //p指针往后移动
p->c = '#';
p->next = NULL;
if(name->next)
{
name=name->next;
c = name->c;
}else{
c = 'z';
}
}
}
void outLink(Link *link)
{
while(link) //Link 不为空就输出
{
cout<c;
link = link->next;
}
}
请输入名字拼音,以#结束:
ZhangFuwa#
生成密码为:
797230#
总结:
1.为什么形式参数用
Link *&head
不用Link *head
答:因为函数参数是单向值传递;而在调用该函数前,链表head不存在,只有在调用该函数后,通过参数传递创建单链表head,所以必须传递指针参数*head的地址,所以必须加上*&引用*。在后面编写修改链表(如插入,删除等)时就不需要加&引用了,因为链表已经存在
2.正序 and 逆序单链表?
一个往前插入,一个往后插入
int a[20];
cout << &a[19];
cout << a+19;
typedef
定义函数,三种调用#include
using namespace std;
typedef void (*funType)(int, double); //定义了新类型funType, 他是一个指向函数的指针
void function(int a, double b) //具体函数
{
cout<
char *s;
*s = "abcdefg";
/*
A错在声明字符指针's'时没有分配存储空间,并且*s的值是一个字符,而不是字符串
*/
char *s;
cin>>s;
/*
B错声明字符指针's'时没有分配存储空间;
应改为:
char *s = new char;
cin>>s;
*/
char *s1 = "abcd", *s2 = "efghijk";
strcpy(s1, s2);
/*
C错在strcpy函数的使用,strcpy第一个参数一定要是字符数组,第二个参数可以是数组也可以是字符常量;毕竟常量是不可以改变的
*/
char *s = "abcdefg";
cout<<*s; //输出第一个字符a
char *s="abcde;
则sizeof(s), sizeof(*s), strlen(s)
分别是多少sizeof(s); //是字符指针的存储空间大小;Visual C++ 对指针变量分配4个字节空间
sizeof(*s); //是字符串首字符的存储空间大小;一个字符占1个字节
strlen(s); //字符串长度,不算\0,共5个
A项,一般为对象的引用
C项,系统默认提供一个拷贝构造函数
D项,用已有对象给新创建的对象初始化是对象赋值,用已有对象新创建一个对象时对象复制
细心!!!,A项包含了其他,不要只盯着私有成员看
getline()
函数叙述错误的是()函数模板与同名的非模板函数重载时候,调用顺序:
1.寻找一个参数完全匹配的函数,如果找到了就调用它
2.寻找一个函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它
3.若1,2都失败,再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等,若找到了,就调用它
4.若1,2,3均未找到匹配的函数,则是一个错误的调用
(1)拥有纯虚函数的类被称为虚拟基类,它不能用来定义对象
错!拥有纯虚函数的类被称为抽象类,它不能用来定义对象
(2)虚函数只有在由继承的情况时才会存在
正确
(3)基类的指针或引用调用虚函数时采用后期绑定
正确,运行时才知道调用谁
#include
using namespace std;
template
T max1(T m1 , T m2)
{
return (m1>m2)?m1:m2;
}
int main()
{
cout<
7 5
y a
注意!!!!, 如果是5.0、2.0这样的数无论函数输出类型是什么,都是5;
但5.6、2.6如果函数返回值类型为double
那么就是5.6、2.5
bool
-1
接收对象名
,调用操作名
和必要参数
A项,C++的实参是从右至左的顺序求的
B项,默认值得设置应该从右往左
C项,可以是表达式下面举例:
int Max(int m, int n);
int a, b;
void Function2(int x, int y=Max(a,b), int z=a*b){ //默认参数是个表达式
//...
}
C++ 关键字
asm do if return typedef auto double inline short typeid
bool dynamic_cast int signed typename break else long
sizeof union case enum mutable static unsigned catch
explicit namespace static_cast using char export new
struct virtual class extern operator switch void
const false private template volatile const_cast
float protected this wchar_t continue for
public throw while default friend register true
delete goto reinterpret_cast try
A: */运算符同级,从左往右,结果不对
B: 都是int结果会省略小数,造成偏差
C: 同B,偏差
D: 正确
x++不能作为左值!!,++x可以
const 常量必须初始化,但是可以缺省类型,默认为int型
C错误,不能既不复制也不指定数组长度
用户可以重新定义标准库函数,若如此,该函数将失去原有含义
预编译处理
#include
using namespace std;
struct Book
{
char title[40];
float price;
} x1 = {"C++dfdf", 29.0}; //正确
int main()
{
Book x = {"C++dfdf", 27.0}; //正确
cout<
-A 主文件
-B 实现文件
-C 库文件
-D 头文件
-A abc
-B *this
-C this
-D this&
问的是参数名,不是参数类型
AB r1 = r2;
语句是将自动调用该类的()AB r1 = r2; 原来没有r1对象,现在从无到有建立一个,并用r2的值赋给r1
C++约定,如果是后置自增自减,运算符重载函数最后一个参数是int,只作为标识,实际上不用
默认是private继承!!!!
<< >> 必须要用友元函数重载,因为他们的函数第一个参数要求流对象,这一点如果重载为成员函数不能满足要求,所以只能用友元函数重载
// + - 原来的含义只要返回值就行,不用返回对象
Value operator+(Value, Value);
Value Value::operator-(Value);
K k; int j;
,已知K中重载了操作运算符(), 且语句j=k(3);
和k(5)=9;
都能顺利执行,说明该操作符函数的原型只可能是()j=k(3) k(5)=9 都可以,说明可以做左值,那么函数一定返回的是引用; 又因为j = k(3),所以一定是int类型。
错X !!!构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。
可以不通过类名和对象名,直接调用友元函数
封装性:指的是将数据和算法捆绑成一个整体,而不是将不同类型的相关数据组合在一起。
多态性:是指一个面向对象的系统常常要求一组具有相同基本语义的方法能在同一接口下为不同对象服务。
私有成员在派生类的对象中不可访问,但是也占据内存空间
一个函数不能既作为重载函数,又作为默认参数的函数
A错,new和delete是用于动态平衡和释放空间的运算符,不是函数
B正确,int *p = new int(5);
C错,用使用delete释放空间,系统会统一管理,而不用delete释放的空间,会造成内存泄漏,这种程序用的次数过多,会造成内存耗尽
D错,不成功,返回0。
#include
class MyClass
{
public:
MyClass(int n){number = n;}
MyClass(MyClass &other){number = other.number;} //拷贝构造函数
~MyClass(){}
private:
int number;
};
MyClass fun(MyClass p) //虚实结合调用第2次
{
MyClass temp(p); //调用第3次
return temp;
}
int main()
{
MyClass obj1(10), obj2(0);
MyClass obj3(obj1); //调用第1次
obj2 = fun(obj3); //返回值调用第4次
return 0;
}
C++中没有规定文件打开时的隐含打开方式,因此写程序时必须指定打开方式,否则将出现错误。
//注意char *的使用
case1:
char *a = "Hello";
fun(a) // 在fun中a的内容不允许改变,因为a是指向一个字符串常量
case2:
char str[20];
char *a = str;
fun(a); //在fun中a的内容可以改变,因为a指向的是字符数组(变量)
#include
#include
using namespace std;
char * reverse(char *str)
{
int size = 0, i=0;
char temp; //交换时的中间变量
size = strlen(str); //字符串的长度,不包含\0
for(i=0; i>str;
str = reverse(str);
cout<
#include
#include
using namespace std;
void reverse(char *str) //这个方法真的棒!
{
char *pStart = str; //指向头
char *pEnd = str+strlen(str)-1; //指向尾
char temp; //交换用的变量
while(pStart < pEnd)
{
temp = *pStart;
*pStart = *pEnd;
*pEnd = temp;
pStart++;
pEnd--;
}
}
int main()
{
char a[20];
char *str = a;
cin>>str;
reverse(str);
cout<
#include
using namespace std;
void fun(char str[100])
{
cout<
4
8
8
#include
using namespace std;
char *GetMemory(void) //形参为空,无法和主调函数沟通数据,函数结束时,p就被释放掉了
{
char p[] = "Helloworld";
return p;
}
int main()
{
char *str =NULL;
str = GetMemory(); //str拿不到数据,仍为空
cout<
int isprime(int)
判断a是不是素数,让a被2~根号a之间(包含)数除,能除尽就不是素数!!
#include
#include
using namespace std;
int main()
{
int isprime(int);
for(int i=1; i<100; i++)
{
int flag = isprime(i);
if(flag==1)
cout<
答案为9。 b+=3+3; b=3+3+3=9
C语言没有过程,只有函数!