C++學習
C++ 條件運算符 ? :
Exp1 ? Exp2 : Exp3;
其中,Exp1、Exp2 和 Exp3 是表達式。請注意冒號的使用和位置。? : 表達式的值取決于 Exp1 的計算結果。如果 Exp1 為真,則Exp1 = Exp2 計算結果。如果 Exp1 為假,則計算 Exp3 的值,且 Exp3 的計算結果則為整個 ? : 表達式的值。
? :也被稱為三元運算符
C++類
類的形式,要表明是class 然后是里面的各種東西 但是呢
class Box
{
public:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
關鍵字 public 確定了類成員的訪問屬性。在類對象作用域內,公共成員在類的外部是可訪問的。
私有(private)私有成員變量或函數(shù)在類的外部是不可訪問的,甚至是不可查看的。只有類和友元函數(shù)可以訪問私有成員。成員和類的默認訪問修飾符是 private。
class Box
{
double width;
public:
double length;
void setWidth( double wid );
double getWidth( void );
};
調用class的做法是:
#include <iostream>
using namespace std;
class Box
{
public:
double length; // 長度
double breadth; // 寬度
double height; // 高度
};
int main( )
{
Box Box1; // 聲明 Box1,類型為 Box
Box Box2; // 聲明 Box2,類型為 Box
double volume = 0.0; // 用于存儲體積
// box 1 詳述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 2 詳述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// box 1 的體積
volume = Box1.height * Box1.length * Box1.breadth;
cout << "Box1 的體積:" << volume <<endl;
// box 2 的體積
volume = Box2.height * Box2.length * Box2.breadth;
cout << "Box2 的體積:" << volume <<endl;
return 0;
}
int main( )
{
Box Box1; // 聲明對象 Box1,類型為 Box
Box Box2; // 聲明對象 Box2,類型為 Box
對象的時候如此聲明。
#include <iostream>
using namespace std;
class Box
{
public:
double length; // 長度
double breadth; // 寬度
double height; // 高度
// 成員函數(shù)聲明
double getVolume(void);
void setLength( double len );
void setBreadth( double bre );
void setHeight( double hei );
}; // 成員函數(shù)定義
double Box::getVolume(void)
{
return length * breadth * height;
}
void Box::setLength( double len )
{
length = len;
}
void Box::setBreadth( double bre )
{
breadth = bre;
}
void Box::setHeight( double hei )
{
height = hei;
}
// 程序的主函數(shù)
int main( )
{
Box Box1; // 聲明 Box1,類型為 Box
Box Box2; // 聲明 Box2,類型為 Box
double volume = 0.0; // 用于存儲體積
// box 1 詳述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 詳述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// box 1 的體積
volume = Box1.getVolume();
cout << "Box1 的體積:" << volume <<endl;
// box 2 的體積
volume = Box2.getVolume();
cout << "Box2 的體積:" << volume <<endl;
return 0;
}
//這個是類的基本用法,可以看出,如果沒有構造函數(shù),那么初始化的時候就非常麻煩。還要不斷調用成員函數(shù)。但是后面的構造函數(shù)就解決了參數(shù)初始化的問題,指針就解決了調用成員函數(shù)的問題
類成員函數(shù)
類的成員函數(shù)是指那些把定義和原型寫在類定義內部的函數(shù),就像類定義中的其他變量一樣。類成員函數(shù)是類的一個成員,它可以操作類的任意對象,可以訪問對象中的所有成員。
成員函數(shù)可以定義在類定義內部,或者單獨使用范圍解析運算符 :: 來定義。在類定義中定義的成員函數(shù)把函數(shù)聲明為內聯(lián)的,即便沒有使用 inline 標識符。所以您可以按照如下方式定義 Volume() 函數(shù):
class Box
{
public:
double length; // 長度
double breadth; // 寬度
double height; // 高度
double getVolume(void)
{
return length * breadth * height;
}
};
也可在外面定義
您也可以在類的外部使用**范圍解析運算符 :: **定義該函數(shù),如下所示:
double Box::getVolume(void)
{
return length * breadth * height;
}
需要強調一點,在 :: 運算符之前必須使用類名。如果調用成員函數(shù)的時候,需要用(.)運算符
Box myBox; // 創(chuàng)建一個對象
myBox.getVolume(); // 調用該對象的成員函數(shù)
范圍解析運算符 :: 在定義成員函數(shù)的時候用
(.)符號在調用成員函數(shù)的時候用
構造函數(shù)
類的構造函數(shù)是類的一種特殊的成員函數(shù),它會在每次創(chuàng)建類的新對象時執(zhí)行。
特點:構造函數(shù)的名稱與類的名稱是完全相同的,并且不會返回任何類型,也不會返回 void。構造函數(shù)可用于為某些成員變量設置初始值。
拷貝構造函數(shù)是一種特殊的構造函數(shù),它在創(chuàng)建對象時,是使用同一類中之前創(chuàng)建的對象來初始化新創(chuàng)建的對象。拷貝構造函數(shù)通常用于
C++ 指向類的指針
int main(void)
{
Box Box1(3.3, 1.2, 1.5); // Declare box1 Box是一個構造函數(shù)
Box Box2(8.5, 6.0, 2.0); // Declare box2
Box *ptrBox; // Declare pointer to a class.
// 保存第一個對象的地址
ptrBox = &Box1;
// 現(xiàn)在嘗試使用成員訪問運算符來訪問成員
cout << "Volume of Box1: " << ptrBox->Volume() << endl;
// 保存第二個對象的地址
ptrBox = &Box2;
// 現(xiàn)在嘗試使用成員訪問運算符來訪問成員
cout << "Volume of Box2: " << ptrBox->Volume() << endl;
return 0;
}
消息訂閱器和發(fā)布器
下面是一個關于subuscriber和publisher的程序
#include <ros/ros.h>
#include <turtlesim/Velocity.h>
#include <sensor_msgs/Joy.h>
class TeleopTurtle
{
public:
TeleopTurtle(); //一個構造函數(shù)
private:
void joyCallback(const sensor_msgs::Joy::ConstPtr& joy); //回調函數(shù)
ros::NodeHandle nh_;
int linear_, angular_;
double l_scale_, a_scale_;
ros::Publisher vel_pub_; //在這里定義了publisher 和subscriber
ros::Subscriber joy_sub_; //
};
// %EndTag(CLASSDEF)%
// %Tag(PARAMS)%
TeleopTurtle::TeleopTurtle(): //構造函數(shù)的定義
linear_(1),
angular_(2) //這個相當于給linear賦值
{
nh_.param("axis_linear", linear_, linear_);
nh_.param("axis_angular", angular_, angular_);
nh_.param("scale_angular", a_scale_, a_scale_);
nh_.param("scale_linear", l_scale_, l_scale_);
//nh_這個handle相當于c++中的class name,param只是這個類下面的一個對象。
vel_pub_ = nh_.advertise<turtlesim::Velocity>("turtle1/command_velocity", 1);
joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopTurtle::joyCallback, this);
}
//定義joyCallback這個回調函數(shù)里面采用了vel_pub_這個publisher。使用的流程是這樣的,先是joy_sub_訂閱了sensor_msgs 的消息,這里面采用了回調函數(shù)joyCallback,再回調的時候,又調用了publisher vel_pub_,把速度信息發(fā)布到turtle1/command_velocity這個topic
void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
turtlesim::Velocity vel;
vel.angular = a_scale_*joy->axes[angular_];
vel.linear = l_scale_*joy->axes[linear_];
vel_pub_.publish(vel);
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "teleop_turtle");
TeleopTurtle teleop_turtle;
ros::spin();
}
構造函數(shù)
構造函數(shù)的名字和類完全一樣,方便賦值
帶參數(shù)的構造函數(shù)
也是和類的名字一樣
折構函數(shù)
析構函數(shù)的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作為前綴,它不會返回任何值,也不能帶有任何參數(shù)。析構函數(shù)有助于在跳出程序(比如關閉文件、釋放內存等)前釋放資源。
問題總結
- 問:int main(int argc, char* argv[])里的(int argc, char* argv[])是什么意思?為什么要用這個?
我的整理,argc 指的是參數(shù)的個數(shù),而argv是運行參數(shù)的字符串數(shù)組(每個char 表示程序路徑名和參數(shù))
答1:很多程序都是帶參數(shù)運行的,比如WINDOWS命令行下的很多實用程序。參數(shù)增加了程序的靈活性。
你可以在“開始”->“運行”中輸入cmd進入命令行。
比如一個叫做del的命令,(刪除文件),其實就是del.exe,它帶參數(shù)的,完整的命令格式可以是
del readme.txt
這個命令將刪除當前路徑下的readme.txt文件(如果有的話);
此時,運行的程序就是del.exe,而readme.txt就是它的參數(shù),
假設del程序的main函數(shù)原型為 int main(int argc, char* argv[]),那么
argc = 1,(1個參數(shù))
argv[0] = “readme.txt”(接收的字符串);
假設一個程序的main函數(shù)不帶任何參數(shù),那么很顯然,它仍可以運行,只是,不接收參數(shù)罷啦
答2:
void main(int argc, char* argv[ ])
假設程序編譯成為 cp.exe
然后在命令行中輸入
c:>cp.exe doc1.txt doc2.txt
這行中有三個字符串分別為 cp.exe doc1.txt doc2.txt
則argc為3,即argc是命令行中參數(shù)的個數(shù)。
char *argv[]為一個指像字符串的數(shù)組。
argv[0]="cp.exe"
argv[1]="doc1.txt"
argv[2]="doc2.txt"
即命令行中各各字符串保存在 *argv[]中
- 下面兩段程序中,&的位置造成了什么不同?????
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
和
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
第一個程序,msg是一個指針,指向std::String的位置,前面的const是定義一個常量指針,也就是說,只能通過指針讀取信息,不能寫;第二個程序,也是指針,但是不知道區(qū)別在哪里。。。。。。
- 類操作里面 (#)和(.)操作分別是什么意思,什么時候用?
范圍解析運算符 :: 在定義成員函數(shù)的時候用 (.)符號在調用成員函數(shù)的時候用
- struct 里面 (.) (->) (&)分別怎么用?
指向結構的指針
您可以定義指向結構的指針,方式與定義指向其他類型變量的指針相似,如下所示:
struct Books *struct_pointer;
現(xiàn)在,您可以在上述定義的指針變量中存儲結構變量的地址。為了查找結構變量的地址,請把 & 運算符放在結構名稱的前面,如下所示:
struct_pointer = &Book1;
為了使用指向該結構的指針訪問結構的成員,您必須使用 -> 運算符,如下所示:
struct_pointer->title;