1.

#include<iostream>
#include<string.h>
using namespace std;
void add(int *p) {
  (*p)++;
  cout<<*p;
  if(*p>5) {
    return;
  }
  add(p);
}
int main() {
  int i=0;
  add(&i);
  return 0;
}

注意:*p++//*,++是同级,从右向左,先进行++,再进行*运算,相当于*(p++),返回的是p的旧值

(*p)++//表示先访问*p,然后将*p的值++;p指针不变



2. //计算每相邻的X位中有几个1


#include<iostream>
#include<string.h>
using namespace std;
int Function(unsigned int n) {
	n=(n&0x55555555)+((n>>1)&0x55555555);//计算每对相邻的2位中有几个1
	n=(n&0x33333333)+((n>>2)&0x33333333);//计算每相邻的4位中有几个1
	n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f); //计算每相邻的8位中有几个1
	n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff); //计算每相邻的16位中有几个1
	n=(n&0x0000ffff)+((n>>16)&0x0000ffff); //计算每相邻的32位中有几个1
	return n;
}
int main() {
	int n=197;
	cout<<Function(n);
	return 0;
}


分析:速度不一定最快,但是想法绝对巧妙。 说一下其中奥妙,其实很简单,先将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。

以217(11011001)为例,有图有真相,下面的图足以说明一切了。217的二进制表示中有5个1

 

C++学习(31)_派生类


3.在声明类时,关键字private、public、protected出现任意次数。(正确)


4.公有继承的保护成员,只能在派生类中访问,不能用派生类对象访问。


C++中派生类对基类成员的访问形式主要有以下两种:

1)、内部访问:由派生类中新增成员对基类继承来的成员的访问。

2)、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则。

 

C++学习(31)_析构函数_02


5.已经i,j都是整型变量,下列表达式中,与下标引用X[i][j]不等效(BC)

A (*[i]+[j])  B *(X+i)[j]

C *(X+i+j)    D *(*(X+i)+j)

解析:对于B,下标操作符优先,(X+i)[j]= (X)[j+i],让后再对其求解引用是(X)[j+i][0]。


6.在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。(正确)

分析:局部变量的作用域会被覆盖同名的全局变量。


7.若有inti=3,*p;p=&i;输出结果为3的是cout<<*p;(正确)


8.

#include<iostream>
#include<string.h>
using namespace std;
struct S{
  int a;
  int b;
};
int main() {
  struct Sa,*p=&a;
  a.a=99;
  cout<<a.a<<""<<p->a<<" "<<(*p).a<<endl;
  return 0;
}

分析:struct S a,*p=&a的意思是定义一个结构体对象a,和指向 结构体 对象a的指针变量p.

p - > a表示p当前指向的对象a中的a(成员),(*p).a也是对象a中的成员a,因为(*p)就是对象a. 对于*p.a,因为.的优先级比*的优先级高,等同于*(p.a)


这里一定要区分.运算符与->运算符的区别。
.运算符是类成员访问运算符,->是指针对象访问成员时用的访问运算符。
*p.a,因为.的优先级比*的优先级高,故上面的表达方式不对,程序将报错。


9.已知const char *node=”ABC”;下列语句合法的是:D

A node[2]=’k’;   B*node[2]=‘k’; C *node=”xyz”;    D node=”xyz”;

分析:const char * node="ABC",这是一个指向字符常量的指针,也就是 *node 的值不能被改变

A, node[2] = 'k';更改coust类型的值,编译不通过

B,*node[2]这种写法本身就是错误的

C,*node ="xyz"; 前面说了,*node的值不能改变

D,node是指针类型,node指向的内容不能改变,但是node指针本身可以改变 node="xyz";这里是让node指向“xyz”的首地址


10.析构函数没有参数。

析构函数名与类名相同,只是在函数名前面加一个位取反符~,以区别于构造函数 。

它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载 。如果用户没有编写析构函数,编译器 自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。


11.(1) 进程间通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件槽、剪切板、动态数据交换、对象连接与嵌入、动态连接库、远程过程调用等

(2) 事件、临界区、互斥量、信号量可以实现线程同步。