Linux 下的VSCode C++配置
: https://www.cnblogs.com/zhumengke/articles/11629820.html
hello world
#include <iostream>
using namespace std;
int main()
cout << "Hello, world!" << endl;
return 0;
简单服务器
* a server
* linux 使用指南
* g++ -std=c++11 -g -o server main.cpp server.cpp
* ./server
//server.h
#ifndef __SERVER_H__
#define __SERVER_H__
namespace ztf{
class Server{
public:
Server();
~Server();
public:
void run();
} //namespace ztf
#endif
//server.cpp
#include <iostream>
#include <unistd.h>
#include "server.h"
namespace ztf{
Server::Server(){
std::cout << "Server construct..." << std::endl;
Server::~Server(){
std::cout << "Server destruct..." << std::endl;
void Server::run(){
while(true){
std::cout << "the server is running..." << std::endl;
::usleep(1000000);
//main.cpp
#include <iostream>
#include "server.h"
int main(int argc,char* argv[]){
ztf::Server* server = new ztf::Server();
if(server){
server->run();
return 0;
View Code
linux 信号处理
// signal
#include <iostream>
#include <unistd.h>
#include <signal.h>
void sighandle(int sig)
std::cout << "sighup received :" << sig << std::endl;
int main(int argc,char **argv)
signal(SIGHUP, sighandle);
signal(SIGINT, sighandle);
signal(SIGQUIT, sighandle);
// pause() causes the calling process (or thread) to sleep until a signal is delivered
// that either terminates the process or causes the invocation of a signal-catching function.
pause();
return 0;
//sigaction
#include <iostream>
#include <unistd.h>
#include <signal.h>
void sighandler(int sig){
std::cout << "received signal: " << sig << std::endl;
int main(int argc, char *argv[])
struct sigaction act, oact;
act.sa_handler = sighandler;
sigfillset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT, &act, &oact);
pause();
return 0;
View Code
UDP Server and UDP Client
// UDP server
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <iostream>
#define SERVER_PORT 8000
int main(int argc, char *argv[])
char buff_recv[512] = {0};
char buff_send[512] = "I am a server!";
int recv_num;
int send_num;
int sock_fd;
int len;
printf("Welcome! This is a UDP server.\n");
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
memset(&serverAddr, 0, sizeof(struct sockaddr_in)); //每个字节都用0填充
serverAddr.sin_family = AF_INET; //使用IPV4地址
serverAddr.sin_port = htons(SERVER_PORT); //端口
/* INADDR_ANY表示不管是哪个网卡接收到数据,只要目的端口是SERV_PORT,就会被该应用程序接收到 */
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取IP地址
len = sizeof(serverAddr);
sock_fd = socket(AF_INET, SOCK_DGRAM, 0); //sock_fd --- socket文件描述符 创建udp套接字
if (sock_fd < 0)
printf("socket error.\n");
exit(1);
int ret = bind(sock_fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); // 绑定socket
if (ret < 0)
perror("bind error:");
exit(1);
while (true)
recv_num = recvfrom(sock_fd, buff_recv, sizeof(buff_recv), 0, (struct sockaddr *)&clientAddr, (socklen_t *)&len);
if (recv_num < 0)
printf("recv error.\n");
break;
buff_recv[recv_num] = 0;
printf("recv data from client:%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff_recv);
send_num = sendto(sock_fd, buff_send, recv_num, 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr));
if (send_num < 0)
printf("sendto error.\n");
break;
return 0;
// UDP Client
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#define SERVER_PORT 8000
#define SERVER_IP "127.0.0.1"
int main(int argc, char **argv)
struct sockaddr_in addr;
int sock;
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
char buff_send[512] = "I am a client!";
char buff_recv[512] = {0};
int len = sizeof(addr);
int n = 0;
printf("This is a UDP client\n");
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
printf("socket error.\n");
exit(1);
if (addr.sin_addr.s_addr == INADDR_NONE)
printf("Incorrect ip address!");
close(sock);
exit(1);
n = sendto(sock, buff_send, strlen(buff_send), 0, (struct sockaddr *)&addr, sizeof(addr));
if (n < 0)
printf("sendto error.\n");
close(sock);
n = recvfrom(sock, buff_recv, 512, 0, (struct sockaddr *)&addr, (socklen_t *)&len);
if (n > 0)
buff_recv[n] = 0;
printf("received from sever:");
puts(buff_recv);
else if (n == 0)
printf("server closed.\n");
else if (n == -1)
printf("recvfrom error.\n");
close(sock);
return 0;
View Code
TCP Server and TCP Client
//tcp Server
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8444
#define MESSAGE_SIZE 1024
int main()
int ret = -1;
int socket_fd = -1;
int accept_fd = -1;
int curpos = 0;
int backlog = 10;
int flag = 1;
char recvBuf[MESSAGE_SIZE] = {0};
char sendBuf[MESSAGE_SIZE] = {0};
struct sockaddr_in local_addr, remote_addr;
//create a tcp socket
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1)
perror("create socket error");
exit(1);
//set option of socket
ret = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
if (ret == -1)
perror("setsockopt error");
//set local address
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(PORT);
local_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(local_addr.sin_zero), 8);
//bind socket
ret = bind(socket_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));
if (ret == -1)
perror("bind error");
exit(1);
ret = listen(socket_fd, backlog);
if (ret == -1)
perror("listen error");
exit(1);
//loop
for (;;)
int addr_len = sizeof(struct sockaddr_in);
//accept an new connection
accept_fd = accept(socket_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&addr_len);
for (;;)
memset(recvBuf, 0, sizeof(recvBuf));
//receive network data and print it
ret = recv(accept_fd, recvBuf, sizeof(recvBuf), 0);
if (ret == 0)
break;
printf("receive message:%s\n", recvBuf);
send(accept_fd, recvBuf, sizeof(recvBuf), 0);
printf("close client connection...\n");
close(accept_fd);
printf("quit server...\n");
close(socket_fd);
return 0;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SERVER_PORT);
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);//inet_addr()函数,将点分十进制IP转换成网络字节序IP
if (connect(socket_fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
perror("connect");
return 1;
printf("success to connect server...\n");
while (1)
memset(sendbuf, 0, MESSAGE_LENGTH);
printf("<<<<send message:");
std::cin >> sendbuf;
ret = send(socket_fd, sendbuf, strlen(sendbuf), 0);
if (ret <= 0)
printf("the connection is disconnection!\n");
break;
if (strcmp(sendbuf, "quit") == 0)
break;
printf(">>> echo message:");
recvbuf[0] = '\0';
data_len = recv(socket_fd, recvbuf, MESSAGE_LENGTH, 0);
recvbuf[data_len] = '\0';
printf("%s\n", recvbuf);
close(socket_fd);
return 0;
View Code
wait and waitpid
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
* fork:
* On success, the PID of the child process is returned in the parent, and 0 is returned in the child.
* On failure, -1 is returned in the parent, no child process is created,
int main(int argc, char *argv[])
pid_t pid = -1;
for (int i = 0; i < 4; i++)
std::cout << i << std::endl;
sleep(2);
if (pid != 0)
pid = fork();
if (pid == 0) //子进程
sleep(2);
else //主进程
* waitpid:
* pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
* status用来保存被收集进程退出时的一些状态, NULL不需要收集进程退出的状态
* options提供了一些额外的选项来控制waitpid
while ((pid = waitpid(-1, NULL, 0)) != -1)
printf("the pid=%d is dead!\n", pid);
View Code
多进程 + fork
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8111
#define MESSAGE_SIZE 1024
int main()
int ret = -1;
int pid;
int socket_fd = -1;
int accept_fd = -1;
int curpos = 0;
int backlog = 10;
int flag = 1;
struct sockaddr_in local_addr, remote_addr;
//create a tcp socket
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1)
perror("create socket error");
exit(1);
//set option of socket
ret = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
if (ret == -1)
perror("setsockopt error");
//set local address
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(PORT);
local_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(local_addr.sin_zero), 8);
//bind socket
ret = bind(socket_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));
if (ret == -1)
perror("bind error");
exit(1);
ret = listen(socket_fd, backlog);
if (ret == -1)
perror("listen error");
exit(1);
for (;;)
int addr_len = sizeof(struct sockaddr_in);
//accept an new connection, block......
accept_fd = accept(socket_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&addr_len);
//create a sub process
pid = fork();
//子进程
if (pid == 0)
char in_buf[MESSAGE_SIZE] = {0};
for (;;)
memset(in_buf, 0, MESSAGE_SIZE);
ret = recv(accept_fd, &in_buf, MESSAGE_SIZE, 0);
if (ret == 0)
break;
printf("receive message:%s\n", in_buf);
send(accept_fd, (void *)in_buf, MESSAGE_SIZE, 0);
printf("close client connection...\n");
close(accept_fd);
//parent process
if (pid != 0) //主进程
printf("quit server...\n");
close(socket_fd);
return 0;
View Code
select
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
#define FD_SIZE 1024
#define MESSAGE_SIZE 1024
int main()
int ret = -1;
int pid;
int accept_fd = -1;
int socket_fd = -1;
int accept_fds[FD_SIZE] = {-1,};
int curpos = -1;
int maxpos = 0;
int backlog = 10;
int flags = 1; //open REUSEADDR option
int max_fd = -1;
fd_set fd_sets;
int events = 0;
struct sockaddr_in local_addr, remote_addr;
//create a tcp socket
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1)
perror("create socket error");
exit(1);
//set option of socket
ret = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &flags, sizeof(flags));
if (ret == -1)
perror("setsockopt error");
//NONBLOCK
flags = fcntl(socket_fd, F_GETFL, 0);
fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK);
//set local address
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(PORT);
local_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(local_addr.sin_zero), 8);
//bind socket
ret = bind(socket_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));
if (ret == -1)
perror("bind error");
exit(1);
ret = listen(socket_fd, backlog);
if (ret == -1)
perror("listen error");
exit(1);
max_fd = socket_fd; //每次都重新设置 max_fd
for (int i = 0; i < FD_SIZE; i++)
accept_fds[i] = -1;
for (;;)
FD_ZERO(&fd_sets); //清空sets
FD_SET(socket_fd, &fd_sets); //将socket_fd 添加到sets
for (int k = 0; k < maxpos; k++)
if (accept_fds[k] != -1)
if (accept_fds[k] > max_fd)
max_fd = accept_fds[k];
printf("fd:%d, k:%d, max_fd:%d\n", accept_fds[k], k, max_fd);
FD_SET(accept_fds[k], &fd_sets); //继续向sets添加fd
//遍历所有的fd
events = select(max_fd + 1, &fd_sets, NULL, NULL, NULL);
if (events < 0)
perror("select");
break;
else if (events == 0)
printf("select time out ......");
continue;
else if (events)
printf("events:%d\n", events);
if (FD_ISSET(socket_fd, &fd_sets))
{ // 如果来的是新连接
printf("listen event :1\n");
int a = 0;
for (; a < FD_SIZE; a++)
if (accept_fds[a] == -1)
curpos = a;
break;
if (a == FD_SIZE)
printf("the connection is full!\n");
continue;
int addr_len = sizeof(struct sockaddr_in);
accept_fd = accept(socket_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&addr_len); //创建一个新连接的fd
int flags = fcntl(accept_fd, F_GETFL, 0); //取出新连接的 fd 的相关选项
fcntl(accept_fd, F_SETFL, flags | O_NONBLOCK); //设置为非阻塞
accept_fds[curpos] = accept_fd;
if (curpos + 1 > maxpos)
maxpos = curpos + 1;
if (accept_fd > max_fd)
max_fd = accept_fd;
printf("new connection fd:%d, curpos = %d \n", accept_fd, curpos);
for (int j = 0; j < maxpos; j++)
if ((accept_fds[j] != -1) && FD_ISSET(accept_fds[j], &fd_sets))
{ //有事件时
printf("accept event :%d, accept_fd: %d\n", j, accept_fds[j]);
char in_buf[MESSAGE_SIZE];
memset(in_buf, 0, MESSAGE_SIZE);
int ret = recv(accept_fds[j], &in_buf, MESSAGE_SIZE, 0);
if (ret == 0)
close(accept_fds[j]);
accept_fds[j] = -1;
printf("receive message:%s\n", in_buf);
send(accept_fds[j], (void *)in_buf, MESSAGE_SIZE, 0);
printf("quit server...\n");
close(socket_fd);
return 0;
View Code
epoll
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
#define FD_SIZE 20
#define MAX_EVENTS 20
#define TIME_OUT 500
#define MESSAGE_SIZE 1024
int main()
int ret = -1;
int socket_fd = -1;
int accept_fd = -1;
int flags = 1;
int backlog = 10;
struct sockaddr_in local_addr, remote_addr;
struct epoll_event ev, events[FD_SIZE];
int epoll_fd = -1;
int event_number = 0;
//creat a tcp socket
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1)
perror("create socket error");
exit(1);
//set REUSERADDR
ret = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&flags, sizeof(flags));
if (ret == -1)
perror("setsockopt error");
//set NONBLOCK
flags = fcntl(socket_fd, F_GETFL, 0);
fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK);
//set address
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(PORT);
local_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(local_addr.sin_zero), 8);
//bind addr
ret = bind(socket_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));
if (ret == -1)
perror("bind error");
exit(1);
if (listen(socket_fd, backlog) == -1)
perror("listen error");
exit(1);
//create epoll
epoll_fd = epoll_create(256); //the size argument is ignored
ev.data.fd = socket_fd;
ev.events = EPOLLIN;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, socket_fd, &ev); //将socket_fd 添加到epoll中
for (;;)
//events 表示一共有多少事件被侦听
//MAX_EVENTS 表示在events个事件中,本次调用最多能返回多少个被解发的事件
//TIME_OUT 表示本次调用最多等多长时间
//event_number 表示本次调用真正有多少事件被解发
event_number = epoll_wait(epoll_fd, events, MAX_EVENTS, TIME_OUT);
for (int i = 0; i < event_number; i++)
if (events[i].data.fd == socket_fd)
{ // 如果是侦听端口的事件
printf("listen event... \n");
int addr_len = sizeof(struct sockaddr_in);
accept_fd = accept(socket_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&addr_len);
//将新创建的socket设置为 NONBLOCK 模式
flags = fcntl(accept_fd, F_GETFL, 0);
fcntl(accept_fd, F_SETFL, flags | O_NONBLOCK);
ev.data.fd = accept_fd;
ev.events = EPOLLIN | EPOLLET;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, accept_fd, &ev);
printf("new accept fd:%d\n", accept_fd);
else if (events[i].events & EPOLLIN)
//printf("accept event :%d\n",i);
char in_buf[MESSAGE_SIZE];
memset(in_buf, 0, MESSAGE_SIZE);
//receive data
ret = recv(events[i].data.fd, &in_buf, MESSAGE_SIZE, 0);
if (ret == MESSAGE_SIZE)
printf("maybe have data....");
if (ret <= 0)
switch (errno)
case EAGAIN: //说明暂时已经没有数据了,要等通知
break;
case EINTR: //被终断了,再来一次
printf("recv EINTR... \n");
ret = recv(events[i].data.fd, &in_buf, MESSAGE_SIZE, 0);
break;
default:
printf("the client is closed, fd:%d\n", events[i].data.fd);
epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, &ev);
close(events[i].data.fd);
printf(">>>receive message:%s\n", in_buf);
send(events[i].data.fd, &in_buf, ret, 0);
return 0;
View Code
reinterpret_const
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
#define FD_SIZE 20
#define MAX_EVENTS 20
#define TIME_OUT 500
#define MESSAGE_SIZE 1024
int main()
int ret = -1;
int socket_fd = -1;
int accept_fd = -1;
int flags = 1;
int backlog = 10;
struct sockaddr_in local_addr, remote_addr;
struct epoll_event ev, events[FD_SIZE];
int epoll_fd = -1;
int event_number = 0;
//creat a tcp socket
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1)
perror("create socket error");
exit(1);
//set REUSERADDR
ret = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&flags, sizeof(flags));
if (ret == -1)
perror("setsockopt error");
//set NONBLOCK
flags = fcntl(socket_fd, F_GETFL, 0);
fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK);
//set address
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(PORT);
local_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(local_addr.sin_zero), 8);
//bind addr
ret = bind(socket_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));
if (ret == -1)
perror("bind error");
exit(1);
if (listen(socket_fd, backlog) == -1)
perror("listen error");
exit(1);
//create epoll
epoll_fd = epoll_create(256); //the size argument is ignored
ev.data.fd = socket_fd;
ev.events = EPOLLIN;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, socket_fd, &ev); //将socket_fd 添加到epoll中
for (;;)
//events 表示一共有多少事件被侦听
//MAX_EVENTS 表示在events个事件中,本次调用最多能返回多少个被解发的事件
//TIME_OUT 表示本次调用最多等多长时间
//event_number 表示本次调用真正有多少事件被解发
event_number = epoll_wait(epoll_fd, events, MAX_EVENTS, TIME_OUT);
for (int i = 0; i < event_number; i++)
if (events[i].data.fd == socket_fd)
{ // 如果是侦听端口的事件
printf("listen event... \n");
int addr_len = sizeof(struct sockaddr_in);
accept_fd = accept(socket_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&addr_len);
//将新创建的socket设置为 NONBLOCK 模式
flags = fcntl(accept_fd, F_GETFL, 0);
fcntl(accept_fd, F_SETFL, flags | O_NONBLOCK);
ev.data.fd = accept_fd;
ev.events = EPOLLIN | EPOLLET;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, accept_fd, &ev);
printf("new accept fd:%d\n", accept_fd);
else if (events[i].events & EPOLLIN)
//printf("accept event :%d\n",i);
char in_buf[MESSAGE_SIZE];
memset(in_buf, 0, MESSAGE_SIZE);
//receive data
ret = recv(events[i].data.fd, &in_buf, MESSAGE_SIZE, 0);
if (ret == MESSAGE_SIZE)
printf("maybe have data....");
if (ret <= 0)
switch (errno)
case EAGAIN: //说明暂时已经没有数据了,要等通知
break;
case EINTR: //被终断了,再来一次
printf("recv EINTR... \n");
ret = recv(events[i].data.fd, &in_buf, MESSAGE_SIZE, 0);
break;
default:
printf("the client is closed, fd:%d\n", events[i].data.fd);
epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, &ev);
close(events[i].data.fd);
printf(">>>receive message:%s\n", in_buf);
send(events[i].data.fd, &in_buf, ret, 0);
return 0;
View Code
static_cast
#include <iostream>
class Base
public:
int a;
int b;
class Derived : public Base
public:
int c;
int d;
int main(int argc, char *argv[])
Base *b = new Base();
Derived *d = new Derived();
Base *p = static_cast<Base *>(d);
p->a = 1;
p->b = 2;
std::cout << "Base: " << p->a << ", "
<< p->b << std::endl;
Derived *dp = static_cast<Derived *>(b);
dp->a = 4;
dp->b = 5;
dp->c = 6;
dp->d = 666;
std::cout << "Derived: " << dp->a << ", "
<< dp->b << ", "
<< dp->c << ", "
<< dp->d << std::endl;
return 0;
View Code
dynamic_cast
#include <iostream>
class Base {
public:
Base(int a, int b){
this->a = a;
this->b = b;
public:
virtual void print(){
std::cout << "member: a=" << a << ", b="
<< b << std::endl;
public:
int a;
int b;
class Derived1: public Base {
public:
Derived1(int a, int b, int o):Base(a, b){
c = o;
public:
virtual void print(){
std::cout << "member: a=" << a << ", b="
<< b << ", c="
<< c << std::endl;
public:
int c;
class Derived2: public Base {
public:
Derived2(int a, int b, int o):Base(a, b){
d = o;
public:
virtual void print() {
std::cout << "member: a=" << a << ", b="
<< b << ", d="
<< d << std::endl;
public:
int d;
int main(int argc, char* argv[])
Base *b = new Base(1, 2);
b = dynamic_cast<Base*>(new Derived1(3, 4, 5));
b->print();
b = static_cast<Base*>(new Derived2(6, 7, 8));
b->print();
View Code
const_cast
#include <iostream>
class Base {
public:
Base(int a, int b){
this->a = a;
this->b = b;
public:
int a;
int b;
int main(int argc, char* argv[])
const Base *b = new Base(1, 2);
std::cout<< "Base: a=" << b->a << ", b="
<< b->b << std::endl;
//b->a = 4; 报错
//b->b = 5; 报错
Base *pb = const_cast<Base*>(b);
pb->a = 3;
pb->b = 4;
std::cout<< "Base: a=" << pb->a << ", b="
<< pb->b << std::endl;
return 0;
View Code
const_point
#include <stdio.h>
int main(int argc, char* argv[])
int p = 3;
int a = 4;
const int pp = 4;
const int *point = &pp;
int const *p2 = &pp;
int* const p3 = &p;
const int* const p4 = &p;
int const * const p5 = &p;
printf("p = %d \n", p);
//////////////////////////
printf("pp = %d \n", pp);
//pp = 5; //报错
//////////////////////////
printf("*point = %d \n", *point);
//*point = 7; //报错
point = &p;
printf("*point = %d \n", *point);
//////////////////////////
printf("*p2 = %d \n", *p2);
//*p2 = 8; //报错
p2 = &p;
printf("*p2 = %d \n", *p2);
//////////////////////////
printf("*p3 = %d \n", *p3);
*p3 = 9;
printf("*p3 = %d \n", *p3);
//p3 = &a; //报错
//////////////////////////
printf("*p4 = %d \n", *p4);
//*p4 = 9; //报错
//p4 = &a; //报错
//////////////////////////
printf("*p5 = %d \n", *p5);
//*p5 = 9; //报错
//p5 = &a; //报错
View Code
vs2017 添加lib和头文件
如果我们借鉴别人写好的代码,放进vs2010编译器时常常出现这样的报错,无法打开源文件 “stdafx.h”:
这是因为在低版本的编译器中,需要添加这部分,比如vc6.0到vs2008,而在vs2010以上版本的编译器中如果出现了这种报错,就查看一下属性->c/c++->预编译头->预编译头文件,其中是否包含了”stdafx.h”文件,如果有注释掉上述代码就好,不会对程序造成影响。
VS2017添加lib库及其头文件
A、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。
B、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。
C 然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名
创建类对象
栈中创建: Human human; // 会自动调用析构函数
堆中创建:Human* p = new Human(); // 不会自动调用析构函数,需要显示的调用delete方法,否则会造成内存泄漏